2013-06-12 153 views
0

比方說,我有一個從外部機器下面的結果:轉義字符

Value_1:(A=12.34, B=34.56, C=12.34, D=34.67) 

我想的strtok得到這些值,所以我有以下的代碼做正是我想要的

ptr = strtok(buff, "Value_,=A:B:C:D()"); 
     i = 0; 
     while (ptr != NULL) 
     { 
      if (i == 0) 
      strcat(out1, ptr); 
      if (i == 1) 
      strcat(out2, ptr); 
      if (i == 2) 
      strcat(out3, ptr); 
      if (i == 4) 
      strcat(out4, ptr); 
      if (i == 6) 
      strcat(out5, ptr); 
      ptr = strtok(NULL, "Value_,=A:B:C:D()"); 
      i++; 
     } 
     printf("Results: %s, %s, %s, %s, %s\n", out1, out2, out3, out4, out5); 

現在我的問題是,如果我有或多或少的變量,如下面的例子我怎樣才能改善我的ptr變量接收這些不同的變量值?

Value_1:(A=12.34, B=34.56, C=12.34, D=34.67, E=50.68) 
Value_1:(A=12.34, B=34.56, C=12.34, D=34.67, E=43.96, F=12.45) 
Value_1:(A=12.34, B=34.56, D=34.67) 

UPDATE

的解決方案是,我改變

ptr = strtok(buff, "Value_,=A:B:C:D()"); 

用一個簡單的

ptr = strtok(buff, "Value_,=:()"); 
+2

使用陣列來代替。 – 2013-06-12 11:38:38

+1

把它們放在一個數組中;) –

+0

順便說一句,你對'strtok()'是如何工作的理解是錯誤的。它將標記任何字符作爲分隔符。 – 2013-06-12 11:41:37

回答

0
#include <stdio.h> 
#include <string.h> 

struct datap { 
    char *sym; 
    char *val; 
}; 

int main(void){ 
    char *test_rec[] = { 
     "Value_1:(A=12.34, B=34.56, C=12.34, D=34.67)", 
     "Value_1:(A=12.34, B=34.56, C=12.34, D=34.67, E=50.68)", 
     "Value_1:(A=12.34, B=34.56, C=12.34, D=34.67, E=43.96, F=12.45)", 
     "Value_1:(A=12.34, B=34.56, D=34.67)" 
    }; 
    int i, j, c, rec_num = sizeof(test_rec)/sizeof(char*); 
    char buff[1024],* p; 
    struct datap out[26]; 

    for(i=0; i<rec_num;++i){ 
     strcpy(buff, test_rec[i]); 
     strtok(buff, "(");//skip to '(' 
     for(c=0;NULL!=(p=strtok(NULL, " ="))/* && c < 26*/;++c){ 
      out[c].sym = p; 
      out[c].val = strtok(NULL, ",)"); 
     } 
     printf("Results: "); 
     for(j = 0; j < c; ++j){ 
      printf("%s=%s", out[j].sym, out[j].val); 
      if(j < c - 1) 
       printf(", "); 
      else 
       printf("\n"); 
     } 
    } 

    return 0; 
} 
1

您正在尋找一個鍵/值對的,但strtok的意志只給你價值。要做你想做的事,你需要鑰匙(A,B,C,D等)。

你不能用strtok做到這一點。

如何使用sscanf的(僞):

find the opening bracket 

do 
    sscanf(bufPos, "%c=%f,%n", &key, &value, &skip); 
    bufPos+=skip 
repeat until buf[bufPos]==')'; 
-2

你應該放在一個陣列從strtok的重新調校的元素。東西如下:

char *ret[MAX_VARS]; 
ptr = strtok(buff, "Value_,=A:B:C:D()"); 
i = 0; 
while (ptr != NULL) 
{ 
    malloc(ret[i], strlen(ptr) + 1); 
    strcpy(ret[i], ptr); 
    ptr = strtok(NULL, "Value_,=A:B:C:D()"); 
    ++ i; 
} 
int j; 
printf("Results: "); 
for(j = 0; j < i; ++ j) printf("%s ", ret[i]); 
printf("\n); 
0

由於格式是相當固定的,你可以用一個稍微簡單的方法來獲取所有的鍵/值。你想如何存儲它們取決於你,但比固定變量名稱更具動態性的方法可能是一件好事。

const char* pattern = ",) "; 

char* ptr = buff + 9;    // Skip "Value_1:(" 
ptr = strtok(ptr, pattern); 
do { 
    printf("key %c, value %s\n", *ptr, ptr+2); 
} while ((ptr = strtok(NULL, pattern)) != NULL && *ptr); 

> key A, value 12.34 
> key B, value 34.56 
> key C, value 12.34 
> key D, value 34.67 
> key E, value 50.68