仅针对一个文件的分段错误?

Posted

技术标签:

【中文标题】仅针对一个文件的分段错误?【英文标题】:Segmentation fault only for one file? 【发布时间】:2015-11-29 17:10:17 【问题描述】:

所以我试图从一个文件(ride.in)中读取输入,用它进行计算,然后将结果打印到另一个文件(ride.out)中。当我尝试使用 fscanf 处理第一个文件时,它工作正常。当我只是使用 printf 打印时,它也可以工作。但是,当我尝试使用 fprintf 写入文件时它无法正常工作,导致 Segmentation Fault: 11. 这怎么可能?

有效的代码:

#include <stdio.h>
#include <stdlib.h>
int main () 
FILE *fin  = fopen ("ride.in", "r");
FILE *fout = fopen ("ride.out", "w");

char UFO[6], group[6];

fscanf(fin, "%s", UFO);
int sumUFO = 0, sumGroup = 0;

for(int i = 0; i < 6; i++)
    sumUFO += (int) UFO[i];


fscanf(fin, "%s", group);

for(int i = 0; i < 6; i++)
    sumGroup += (int) group[i];


fclose(fin);

if(sumUFO == sumGroup)
    printf("GO");
else
    printf("STAY");

exit (0);

但是,当我将最后一个 if 语句更改为使用 fprintf 而不是 printf 时,我得到一个分段错误:11。这是最后一个 if 语句。其他没有任何改变:

if(sumUFO == sumGroup)
    fprintf(fout,"GO");
else
    fprintf(fout,"STAY");

输入ride.in 目前看起来像:

AAAAAA
AAAAAA

输出ride.out 当前是一个空文本文件。

【问题讨论】:

检查fopen的返回值,即fout不是NULL 您的文件是否超过 6 个字节? 您缺少所有错误检查。 fopen()fscanf() 之类的函数可能会失败。将%s 与未知输入上的有界字符串一起使用也会导致缓冲区溢出,您应该告诉fscanf() 缓冲区的实际大小。 这是你的问题——你正在将一个 6 个字符的字符串读入一个 6 个字符的数组。使您的数组更大,以便为终止空值留出空间。此外,"%6s" 将是 fscanf 更安全的格式说明符。 函数:fscanf() 自动在 '%s, so a total of 7 characters will be written into each of the input buffers UFO[]` 和 'group[]` 读取的字符串末尾附加一个 NUL 字节,但是这些数组只有 6 个字符长,结果写入数组末尾。这是未定义的行为,并且(如您所述)会导致段错误事件。 【参考方案1】:

您正在将一个 6 个字符的字符串读入一个 6 个字符的数组。使您的数组更大,以便为终止空值留出空间。此外,“%6s”对于 fscanf 来说是一个更安全的格式说明符(否则,如果输入文件格式错误,您将面临缓冲区溢出的风险)。

【讨论】:

【参考方案2】:
    在调用第一个 fscanf() 后,它正在读取 6 个字符 bt,当您调用第二个 fscanf() 时,它没有找到下一个字符必须读取的指针。 为此,您必须使用 lseek()。

这里是代码 =>

#include <stdio.h>
#include <stdlib.h>
int main () 
FILE *fin  = fopen ("ride.in", "r");
FILE *fout = fopen ("ride.out", "w");
int i;
char UFO[6], group[6];

fscanf(fin, "%s", UFO);
int sumUFO = 0, sumGroup = 0;

for(i = 0; i < 6; i++)
 sumUFO += (int) UFO[i];
 printf("%c => %d \n",UFO[i],sumUFO );

fseek(fin,6,SEEK_SET);

fscanf(fin, "%s", group);
for(i = 0; i < 6; i++)
 sumGroup += (int) group[i];
 printf("%c =>> %d \n",group[i],sumGroup );



fclose(fin);

if(sumUFO == sumGroup)
 fprintf(fout,"GO");
else
 fprintf(fout,"STAY");

return 0;

在这段代码中 fprintf() 工作正常 ....

【讨论】:

以上是关于仅针对一个文件的分段错误?的主要内容,如果未能解决你的问题,请参考以下文章

这段代码一次执行良好,另一次出现分段错误

并行运行 MEX 文件时的分段错误

分段错误(核心转储)

从文本文件中读取行时出现字符串分段错误

VSCode 仅针对打开的文件显示 TSLint 错误

为啥写作主要;在 C 中给出一个段错误