0

我有一个从文件中读取的函数:

void input(char* buffer, FILE* fp)
{
    char temp[100];
    fgets(temp,100,fp);
    strcpy(buffer,temp);
    buffer [strlen(buffer)-1]=0;
}

我提出:

1
2
3
4
5

最后一行以换行符结束。
我尝试以这种方式读取文件:

FILE* fp=fopen("myfile.txt","r");
while(!feof(fp))
{
    char buffer[100];
    input(buffer,fp);
    puts(buffer);
}

它成功读取了所有五个字符串:"1","2","3","4","5" 并打印它们,但是在打印第 5 个字符串后,出现分段错误。

4

3 回答 3

4

这是 C(和其他语言,真的)中常见的反模式,用于设置像你这样的循环来检查!feof(fp). 问题是这个函数只有在由于 EOF 导致读取失败后才返回 true。问题是您在检查读取是否成功之前使用了读取的结果。

我建议你检查 的返回值,如果有 EOFfgets()就会返回。NULL将该值传播回来并从您的input()函数中返回。然后在你的循环条件中使用它。

补充一点,段错误本身很可能在您调用strcpy(). 失败时fgets(),您尝试复制未初始化数据的缓冲区,该缓冲区可能包含任何内容,并且strcpy()可能会找到比缓冲区长得多的“字符串”。即使它碰巧找到更短的东西,你的结果仍然是垃圾。

于 2012-05-05T19:30:06.703 回答
1

好像

buffer [strlen(buffer)-1]=0;

在最后一个空白行,strlen 为 0,并且缓冲区被设置在其范围之外。

于 2012-05-05T19:30:55.783 回答
-2

表示字符串结尾的字符不是 '0' 而是 '\0' 所以替换这一行:

  buffer [strlen(buffer)-1]=0;

经过

  buffer [strlen(buffer)-1]='\0';

应该没问题:)

于 2012-05-05T19:26:37.353 回答