在C中复制strtok令牌的内容

时间:2018-03-02 16:30:51

标签: c delimiter strtok

需要分隔字符串然后再进行另一次分离。

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),但不确定我应该怎么做。

1 个答案:

答案 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,其工作方式相同。