C 打印strtok令牌时出现分段错误
我试图使用C 打印strtok令牌时出现分段错误,c,segmentation-fault,printf,output,strtok,C,Segmentation Fault,Printf,Output,Strtok,我试图使用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 =
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()<>|&;");
}
char缓冲区[256];
字符*令牌`
fgets(缓冲区,256,标准输入);
令牌=strtok(缓冲区“\n\t()|&;”);
while(令牌!=NULL){
printf(“%s”,标记);
计数++;
token=strtok(NULL,“\n\t()|&;”;
}
但是,每当我调用
printf
时,我都会遇到一个分段错误,我似乎无法确切地找出原因。我看不出您的代码有问题(除了第二行末尾的零散的`
,我假设它不在您的实际代码中)
但是,这一行:
printf("%s",token);
永远不会打印任何换行符,这意味着它永远不会刷新输出缓冲区。因此,如果您的程序稍后出现分段错误,它可能看起来像是在您打印第一个令牌之前发生的,因为它阻止了输出缓冲区被刷新
出于调试目的,请尝试将上述内容更改为:
printf("%s\n",token);
并查看在segfault之前打印的内容。好的,我将您的代码更改为一个完整的程序,cf:
#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;
}
当然,这里没有空格或换行符。当我添加\n
,我得到
现在,请注意,我必须删除您的back tick(我假设这是一个输入错误),并且我必须声明您的count
变量,但前提是它可以工作
从这一点,我推断您可能在您展示给我们的错误片段周围有代码。我刚刚测试了它,它工作正常。你确定没有从程序的不同部分得到segfault吗?仅使用此代码的短程序在没有分段错误的情况下工作正常。你能发布一个失败的代码片段吗?@MartinMajer只要在主函数中放置上面的代码,无论我输入什么,每次运行它都会导致segfault。添加打印以测试故障发生的位置,似乎是在打印令牌的printf上,因为在该点之前发生的打印将被执行,但在后续打印之前,我得到了一个segfault。@user3035026我相信您,但除非我们能够重现它,否则我们将无法诊断问题。几乎可以肯定,您粘贴的代码与正在运行的代码不完全相同——例如,额外的“```字符和未声明的
count
变量——因此,查看a将有助于理解程序失败的原因。@qwrty看起来我应该按照您所说的粘贴整个程序,这个问题最终只是被遗忘的#include
在阅读了这里的所有评论和答案后,我不明白为什么我仍然会遇到错误。然后我又看了看你的,意识到我愚蠢地忘了把它包括进去。如果没有它,它甚至不能为我编译。(从中你可以推断,我必须自己加上它:-)我觉得它没有它也编译起来有点奇怪。但是把它加进去解决了这个问题!
bash $ ./a.out
the quick brown fox
thequickbrownfoxbash $
bash $ ./a.out
the quick brown fox
the
quick
brown
fox
bash $