Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 打印strtok令牌时出现分段错误_C_Segmentation Fault_Printf_Output_Strtok - Fatal编程技术网

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 $