打印strtok令牌时出现分段错误

时间:2013-12-08 21:58:37

标签: 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 = strtok(NULL," \n\t()<>|&;");
}

每当我进入printf电话时,我都会遇到分段错误,但我似乎无法弄明白为什么。

2 个答案:

答案 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变量,但鉴于它有效。

由此我推断出你可能在你向我们展示的那些片段周围有代码。

相关问题