Strtok与Strcat发生冲突

时间:2011-09-14 16:21:59

标签: c strtok strcat

我正在尝试使用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总是丢失。有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

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

进入循环后,缓冲区包含:“1 \ 02 \ 03/4/5/6”内部strtok指针指向“3”。令牌[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);
}

答案 1 :(得分:0)

strtok修改输入字符串并返回指向该字符串的指针。然后,您可以使用其中一个指针(token[0])并将其传递给写入该指针的另一个操作(strcat)。这些写作互相辱骂。

如果要连接所有令牌,则应该为char*分配一个单独的strcpy