在C中复制strtok令牌的内容

Kag*_*sen 4 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");
Run Code Online (Sandbox Code Playgroud)

试图复制内容token,但这样做会混淆token变量中的内容.它只处理一行而不是它应该处理的三行.我怀疑问题是strcpy(current_string, token)但不确定我应该怎么做.

dbu*_*ush 6

strtok函数使用内部静态缓冲区来跟踪它停止的位置.这意味着你无法使用它来来回解析两个不同的字符串.

在您的具体情况下,请致电:

token = strtok(0, ",");
Run Code Online (Sandbox Code Playgroud)

内部缓冲区仍指向内部的位置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");
Run Code Online (Sandbox Code Playgroud)

请注意,NULL传递给后来的strtok_r调用而不是0,因为NULL可能不一定0.此外,对malloc/ 的调用strcpy替换strdup为相同的调用,并且还free添加了调用以防止内存泄漏.

strtok_r可UNIX/Linux系统上.在Windows上,使用strtok_s相同的方式.