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