假设我从外部机器获得以下结果:
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_,=:()");
答案 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);