数组大小超出范围 [duplicate]

Size of array out of range [duplicate]

提问人: 提问时间:9/30/2020 最后编辑:Vlad from Moscow 更新时间:9/30/2020 访问量:66

问:

我正在尝试编写以 x y 的形式从 FILE 中读取几个数字并将它们存储在两个数组中的代码,并且我希望该函数返回对数,我尝试使用包含 5 对的 FILE,但似乎 FILE *ptr 超越并到达第六行, 这是我的代码:

#include<stdio.h>
#include<stdlib.h>

int main()
{  
   int X[100],Y[100];
   int i=0; int Ncouple = 0 ;int M = 5;

   FILE *fptr;
   fptr = fopen("num.data", "r");
   
   if( fptr == NULL)
   {
    printf("fail");
    exit(1);
   }
   
   while(!feof(fptr))
   {
     fscanf(fptr,"%d %d",&X[i],&Y[i]);
     printf("\nX[%d] = %d Y[%d] = %d\n",i,X[i],i,Y[i]);
     i++;Ncouple++;
   }

   fclose(fptr);
   return 0;
}

当我执行时,我得到 X[6] 和 Y[6],但我的日期文件只包含 5 行。我错在哪里?

C 循环 文件 while-loop feof

评论


答:

3赞 Vlad from Moscow 9/30/2020 #1

while 语句中的条件是您所描述的行为的原因。

while(!feof(fptr))

在您尝试读取文件中不存在的记录后,此条件将等于 true。

重写 while 循环,如

while( fscanf(fptr,"%d %d",&X[i],&Y[i]) == 2 )
{
    printf("\nX[%d] = %d Y[%d] = %d\n",i,X[i],i,Y[i]);
    i++;Ncouple++;
}

注意这一点,而不是这一行声明

int i=0; int Ncouple = 0 ;int M = 5;

最好写

int i=0; 
int Ncouple = 0;
int M = 5;

或者至少喜欢

int i=0, Ncouple = 0, M = 5;

评论

0赞 9/30/2020
谢谢,我在这个问题上浪费了太多时间,但我想知道为什么这样做,为什么 2 ?
0赞 Vlad from Moscow 9/30/2020
@ElMehdiAKKOUCHE 如果成功,函数 fscanf 将返回分配的输入项数。
0赞 Vlad from Moscow 9/30/2020
@ElMehdiAKKOUCHE 由于没有更多的答案,您可以选择我的答案作为结束您的问题的最佳答案。
0赞 9/30/2020
对不起,你能用我不明白的不同方式解释吗
0赞 Vlad from Moscow 9/30/2020
@ElMehdiAKKOUCHE 如果 fscanf 的调用成功,则意味着项目 C[i] 和 Y{i] 都获得了值。有两个项目,它们都有值。因此,在成功的情况下,该函数返回 2。如果出现错误,它将返回 EOF。