gpt4 book ai didi

c - 如何修复 'Segmentation fault (core dumped)'

转载 作者:行者123 更新时间:2023-11-30 19:25:31 24 4
gpt4 key购买 nike

我正在努力解决我的作业。问题是要求实现函数 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;
}

最佳答案

(如果您使用的是 Linux,请使用 -fsanitize=address 标志编译您的程序。如果您的程序遇到段错误,它会详细地告诉您出了什么问题)。

如果您的文件包含长度超过 256 个字符的“单词”(非空白字符序列)(可能是德语,或者玛丽·波宾斯 (Mary Poppins) 的文本),fscanf 将写入那么多字符放入 word 中,导致溢出。这可能会导致段错误。

您可以通过限制 fscanf 将尝试写入的字符数来防止这种情况:

fscanf(fp,"%256s",word);

这可能会将一个“单词”分成两个或多个部分,但只有最后带点的部分才会被计算在内(除非该单词看起来像“twohundred-and-555-characters.some-more”)。

请注意,如果没有存储字段,fscanf 可以返回零,尽管在使用 %s 时这似乎不可能。在这种情况下,您将把 strlen 应用于未初始化的内存,这可能会导致段错误。

此外,如果 fscanf 返回一个空字符串(似乎也是不可能的),strlen 将返回零,并且您将尝试读取 word[- 1],即缓冲区欠载。在减去之前,您应该检查 strlen 的结果。

关于c - 如何修复 'Segmentation fault (core dumped)',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58669742/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com