【问题标题】:Strtok and Strcat conflictStrtok 和 Strcat 冲突
【发布时间】:2011-09-14 16:21:58
【问题描述】:

我正在尝试使用 strtok 和 strcat,但第二个 printf 从未出现。代码如下:

int i = 0;
char *token[128];
token[i] = strtok(tmp, "/");
printf("%s\n", token[i]);
i++;
while ((token[i] = strtok(NULL, "/")) != NULL) {
    strcat(token[0], token[i]);
    printf("%s", token[i]);
    i++;
}

如果我的 tmp 输入是 1/2/3/4/5/6,那么控制台输出将为 13456。2 总是丢失。有谁知道如何解决这个问题?

【问题讨论】:

    标签: c strtok strcat


    【解决方案1】:

    这两个总是丢失,因为在你的循环的第一次迭代中,你用对 strcat 的调用覆盖了它。

    进入循环后,您的缓冲区包含:“1\02\03/4/5/6”内部 strtok 指针指向“3”。 tokens[1] 指向“2”。

    然后你调用 strcat: "12\0\03/4/5/6" 所以你的 token[i] 指针指向 "\0"。第一次打印什么也不打印。

    后续调用正常,因为空字符不会覆盖输入数据。

    要修复它,您应该将输出字符串构建到第二个缓冲区中,而不是您正在解析的那个。

    工作(?)版本:

    #include <stdio.h>
    #include <string.h>
    int main(void)
    {
        int i = 0;
        char *token[128];
        char tmp[128];
        char removed[128] = {0};
        strcpy(tmp, "1/2/3/4/5/6");
        token[i] = strtok(tmp, "/");
        strcat(removed, token[i]);
        printf("%s\n", token[i]);
        i++;
        while ((token[i] = strtok(NULL, "/")) != NULL) {
            strcat(removed, token[i]);
            printf("%s", token[i]);
            i++;
        }
        return (0);
    }
    

    【讨论】:

      【解决方案2】:

      strtok 修改输入字符串并返回指向该字符串的指针。然后,您获取其中一个指针 (token[0]) 并将其传递给另一个写入该指针的操作 (strcat)。写入相互冲突。

      如果你想连接所有的令牌,你应该分配一个单独的char*strcpy到。

      【讨论】:

        猜你喜欢
        • 2020-02-29
        • 1970-01-01
        • 2017-03-15
        • 2012-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-27
        相关资源
        最近更新 更多