为什么我只读了一个单词后才会出现分段错误?
如果我输入“为什么这不起作用”
我才回来
为什么
然后我遇到了分段错误。
我见过其他例子,但没有人像我在这里尝试的那样使用了用户输入。我只能阅读一个单词,但它不起作用。我尝试将所有%c更改为%s,但它没有帮助我。我也意识到分段错误指针指向不在内存中的某个地方,但我看不出它有什么问题。请帮我理解。
#include <stdio.h>
#include <string.h>
int main()
{
char word[100];
printf("Enter a sentence: ");
scanf("%s", word);
char *tok = strtok(word, " ");
printf("%s\n", tok);
while(tok != NULL)
{
tok = strtok(NULL, " ");
printf("%s\n", tok);
if(tok == NULL)
printf("finished\n");
}
return 0;
}
编辑:我更改了scanf(“%s”,word);到fgets(单词,100,stdin);现在它打印所有内容但我收到了分段错误。
答案 0 :(得分:2)
正如评论中所指出的,您的第一个代码中至少存在两个问题。
不要使用scanf
来读取要解析的字符串。请改用fgets
。
在使用之前(tok
循环内部)<{1}}
while
是否为空
醇>
通过调试很容易检测到这些问题,因此我建议您阅读how to debug small programs
更正的代码应该是:
#include <stdio.h>
#include <string.h>
int main(void)
{
char word[100];
printf("Enter a sentence: ");
/* read from stdin
note the `sizeof char`, if you need to change the size of `word`,
you won't have to change this line. */
fgets(word, sizeof word, stdin);
/* initialize parser */
char *tok = strtok(word, " ");
while (tok != NULL)
{
/* printf token: it cannot be NULL here */
printf("%s\n", tok);
/* get next token*/
tok = strtok(NULL, " ");
}
printf("finished\n");
return 0;
}
答案 1 :(得分:0)
此代码不正确
while(tok != NULL)
{
tok = strtok(NULL, " ");
printf("%s\n", tok);
if(tok == NULL)
printf("finished\n");
}
假设你到达循环的最后一次传递......它会像你上次一样进入循环....所以你创建了一个tok = strtok(NULL, " ");
返回(和分配){{1}因为没有更多的东西....然后你NULL
它,它产生了seg错误。
只需将其更改为此内容,如果没有其他令牌可用,则不要进入循环。
printf(3)
或更简单
while((tok = strtok(NULL, " ")) != NULL)
{
printf("%s\n", tok);
/* you don't touch tok inside the loop, so you don't need to
* test it again once you get inside */
}
/* if(tok == NULL) <-- you always have tok == NULL here */
printf("finished\n");
此外,将while(tok = strtok(NULL, " "))
{
printf("%s\n", tok);
}
printf("finished\n");
添加到\n
来电的第二个参数(在您的商家信息中的两个来电中,因为您只能有一个令牌,并且必须删除最后一行结尾)从第一次通话开始),就像你使用strtok(3)
时一样,你通常会在字符串的末尾得到一个fgets(3)
(你不想要):
\n