用strtok转义字符

时间:2013-06-12 11:36:34

标签: c strtok

假设我从外部机器获得以下结果:

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)

更新

解决方案是我改变了

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

用简单的

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

4 个答案:

答案 0 :(得分:1)

您正在搜索键/值对,但strtok只会为您提供值。要做你想做的事,你需要钥匙(A,B,C,D等)。

你不能用strtok做到这一点。

如何使用sscanf(psuedo):

find the opening bracket

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

答案 1 :(得分: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

答案 2 :(得分: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;
}

答案 3 :(得分:-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);