我正在努力解决作业。 问题是要实现将文本文件作为输入并返回文件中句子数的函数count(FILE * fp)。
但是输出显示错误“分段错误(核心已转储)”。
int count(FILE *fp)
{
int count=0;
char word[256];
while(fscanf(fp,"%s",word)!=EOF)
{
if(word[strlen(word)-1]=='.')
{
count+=1;
}
}
return count;
}
答案 0 :(得分:1)
(如果您使用的是Linux,请使用-fsanitize=address
标志编译程序。如果您的程序遇到分段错误,它将告诉您详细的错误信息)。
如果您的文件中包含的“单词”(非空格字符序列)长于256个字符(可能是德语,或者是Mary Poppins的文本),则fscanf
将写入那么多字符放入word
中,使其溢出。这可能会导致分割错误。
您可以通过限制字符数fscanf
来尝试写:
fscanf(fp,"%256s",word);
这可能会将“单词”分为两个或更多部分,但仅会计算带点的最后一部分(除非单词看起来像“两百五十五个字符。更多”)。
请注意,如果没有存储任何字段,fscanf
可以返回零,尽管在使用%s
时这似乎是不可能的。在这种情况下,您将strlen
应用于未初始化的内存,这可能会导致分段错误。
此外,如果fscanf
返回一个空字符串(也似乎是不可能的),则strlen
将返回零,并且您将尝试读取word[-1]
,即缓冲区不足。从中减去strlen
的结果之前,应先进行检查。
答案 1 :(得分:-1)
如果strlen(word)返回的值大于256(意味着您的句子中的字符数超过256个),则会出现分段错误。
您可以在Bulletmagnet的答案中找到解决方案