我试图使用fgets
从stdin获取一行用户输入,用strtok
标记它,然后打印每个标记以确保它被正确标记化。我的代码如下:
char buffer[256];
char *token;`
fgets(buffer, 256, stdin);
token=strtok(buffer," \n\t()<>|&;");
while(token!=NULL) {
printf("%s",token);
count++;
token = strtok(NULL," \n\t()<>|&;");
}
每当我进入printf
电话时,我都会遇到分段错误,但我似乎无法弄明白为什么。
答案 0 :(得分:2)
我没有看到你的代码有问题(除了第二行末尾的迷路`
,我认为这不在你的实际代码中。)
然而,这一行:
printf("%s",token);
永远不会打印任何换行符,这意味着它永远不会刷新输出缓冲区。因此,如果您的程序稍后出现分段错误,则在打印第一个令牌之前,它可能看起来像那样,只是因为它阻止了输出缓冲区被刷新。
出于调试目的,请尝试将上述内容更改为:
printf("%s\n",token);
并查看在segfault之前打印的内容。
答案 1 :(得分:0)
好的,我将您的代码更改为完整的程序,参见:
#include <stdio.h>
#include <string.h>
int main() {
char buffer[256];
char *token;
int count = 0;
fgets(buffer, 256, stdin);
token=strtok(buffer," \n\t()<>|&;");
while(token!=NULL) {
printf("%s\n",token);
count++;
token = strtok(NULL," \n\t()<>|&;");
}
return 0;
}
当我以原始形式运行它时,它可以工作
bash $ ./a.out
the quick brown fox
thequickbrownfoxbash $
虽然当然没有空格或换行符。当我添加\n
时,(如上面的代码所示)我得到了
bash $ ./a.out
the quick brown fox
the
quick
brown
fox
bash $
现在,请注意我必须删除你的后退(我认为这是一个拼写错误)我必须声明你的count
变量,但鉴于它有效。
由此我推断出你可能在你向我们展示的那些片段周围有代码。