我正在尝试调整以下工作代码:
http://www.cplusplus.com/reference/cstring/strtok/
如下:
#include <stdio.h>
#include <string.h>
int main (int argc, const char * argv[]) {
char input[10];
scanf("%s", input);
char * pch;
pch = strtok(input, " ");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok(NULL, " ");
}
return 0;
}
如果我输入
test string to tokenize
我才回来
test
我做错了什么?
答案 0 :(得分:4)
答案 1 :(得分:2)
尝试在char[10]
中存储字符串“test string to tokenize”将导致缓冲区溢出。之后,任何事都可能发生。增加input
:
char input[256];
此外,正如@H2CO3所述,您应该使用fgets(...)
而不是scanf("%s", ...)
,以避免出现空白问题。
答案 2 :(得分:2)
scanf("%s", input);
有几个问题:
%s
转换说明符会使scanf()
扫描到第一个空格。您在缓冲区中获得的只是test
。
test string to tokenize
不适合10个字符。
使用fgets()
代替适当大小的缓冲区:
char buf[LINE_MAX];
fgets(buf, sizeof(buf), stdin);
另一条建议:使用strtok_r()
代替strok()
,它更安全。
char *endp;
char *p = strtok_r(buf, " ", &endp);
while (p) {
puts(p);
p = strtok_r(NULL, " ", &endp);
}
答案 3 :(得分:0)
scanf("%s", input);
这会在遇到空格或\n
之前接受输入。实际上,您只需将“test”作为参数输入strtok
。
您需要使用类似getline
的内容来输入带空格的行。
另外,正如其他人所指出的,你的缓冲区可能会溢出。