需要分隔字符串然后再进行另一次分离。
char *token = strtok(str, ",");
while(token){
char *current_string = malloc(sizeof(char) * strlen(token));
strcpy(current_string, token);
char *tk = strtok(current_string, ":"); // KEY
printf("key: %s ", tk);
tk = strtok(0, ":"); // VALUE
printf("value: %s\r\n", tk);
printf("%s\n", token);
token = strtok(0, ",");
}
printf("Done\n");
尝试复制token
的内容,但这样做会混淆token
变量中的内容。它只处理一行而不是它应该处理的三行。我怀疑问题出在strcpy(current_string, token)
,但不确定我应该怎么做。
答案 0 :(得分:6)
strtok
函数使用内部静态缓冲区来跟踪它停止的位置。这意味着你无法使用它来来回解析两个不同的字符串。
在您的具体情况下,请致电:
token = strtok(0, ",");
内部缓冲区仍然指向current_string
内的某个位置,因此尝试返回token
将无效。
strtok_r
需要什么。此版本采用附加参数来跟踪当前状态。这样,您可以通过为每个字符串使用不同的状态指针来互换地解析两个或更多字符串:
char *state1, *state2;
char *token = strtok_r(str, ",", &state1);
while(token){
char *current_string = strdup(token);
char *tk = strtok_r(current_string, ":", &state2); // KEY
printf("key: %s ", tk);
tk = strtok_r(NULL, ":", &state2); // VALUE
printf("value: %s\r\n", tk);
printf("%s\n", token);
free(current_string);
token = strtok_r(NULL, ",", &state1);
}
printf("Done\n");
请注意,NULL
已传递给后来的strtok_r
次来电而非0
,因为NULL
可能不一定是0
。此外,对malloc
/ strcpy
的调用已替换为strdup
调用,但同时调用free
以防止内存泄漏。
{/ 1}}在UNIX / Linux系统上可用。在Windows上,使用strtok_r
,其工作方式相同。