fscanf()遇到EOF后程序崩溃

时间:2016-06-15 10:46:24

标签: c file-io file-handling eof scanf

我甚至不确定fscanf()是否真的遇到EOF。这是我的代码

#include<stdio.h>

int main()
{
int i=0,a[13];
FILE *fp;
fp=fopen("test.txt","r");
if(fp==NULL)
{
    printf("Error");
}
else
{
    i=0;
    while((fscanf(fp,"%d",&a[i]))!=EOF)
    {
        printf("%d\n",a[i]);
        i++;
    }
    printf("%d",i);
}
fclose(fp);
return 0;
}

测试输入是:

  

12
32
45
65
92
-1
0
61
15
13
12
24
0
4

我在代码块中运行它。

This is the runtime condition

2 个答案:

答案 0 :(得分:4)

这不是fsanf()返回EOF,而是在此之前,通过提供更长的输入序列,您将超越目标数组{{1} }。尝试访问超出范围的内存调用undefined behavior。结果可以是任何

当你已经有一个固定长度的数组时,不要允许存储任意数量的输入,用数组大小​​(a)限制索引。

答案 1 :(得分:0)

您的输入有14个元素,您尝试将其读入13个元素数组a[13]。这就是你崩溃的原因。 增加阵列的大小或保护阵列不溢出。例如

#include<stdio.h>

#define ARR_SIZE 14

int main()
{
  int i;
  int a[ARR_SIZE];
  FILE *fp;

  fp=fopen("test.txt","r");
  if(fp==NULL)
  {
     printf("File open error\n");
  }
 else
 {
      i=0;
      while ( (i<ARR_SIZE) && (fscanf(fp,"%d",&a[i]))!=EOF)
      {
         printf("%d\n",a[i]);
         i++;
      }

   printf("%d",i);
  }

  fclose(fp);
  return 0;
}
相关问题