【发布时间】: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 buffersUFO[]` 和 'group[]` 读取的字符串末尾附加一个 NUL 字节,但是这些数组只有 6 个字符长,结果写入数组末尾。这是未定义的行为,并且(如您所述)会导致段错误事件。
标签: c file io segmentation-fault