仅针对一个文件的分段错误?
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() 工作正常 ....
【讨论】:
以上是关于仅针对一个文件的分段错误?的主要内容,如果未能解决你的问题,请参考以下文章