如何修复“分段错误(核心已转储)”

时间:2019-11-02 09:20:35

标签: c

我正在努力解决作业。 问题是要实现将文本文件作为输入并返回文件中句子数的函数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;
}

2 个答案:

答案 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的答案中找到解决方案