为了简短起见,该程序应该从格式为“int string”的文件中读取,例如“5利物浦(新线)2曼彻斯特”并在屏幕上打印内容。问题发生在第4次(总共5次)迭代中,程序崩溃了。我想更好的方法是使用诸如gets之类的函数,但是,这是针对C中的入门级类,所以我很确定这些函数没有被课程所涵盖。在你研究它之前,我在fscanf上使用了与另一个问题相同的原理,并且它完美地工作(但文件被格式化为“string int”)。任何帮助将非常感激。感谢。
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *dat;
FILE *dat1;
dat = fopen("ekipe.txt", "r");
int ek[5], bd[5], i = 0, t1, t2, g1, g2;
char im[5][10];
for(i = 0; i < 5; i++)
bd[i] = 0;
if(dat)
while(!feof(dat))
{
fscanf(dat, "%d %s\n", &ek[i], &im[i]);
printf("%d %s\n", ek[i], im[i]);
i++;
}
fclose(dat);
system("PAUSE");
return 0;
}
答案 0 :(得分:1)
for(i = 0; i < 5; i++)
bd[i] = 0;
此处,变量i
取自0
至5
。
在循环之后,仍然是5
。
所以,你的下一个循环:
while(!feof(dat))
{
fscanf(dat, "%d %s\n", &ek[i], &im[i]);
printf("%d %s\n", ek[i], im[i]);
i++;
}
总是在你的数组边界上运行。
这似乎是“偶然”工作四次,可能与您在函数中声明的变量有关(在堆栈中创建空间并阻止操作系统检测到内存访问冲突),或者至少阻止其他更低级别的构造被覆盖在内存中,造成进一步的痛苦)。但是,从根本上说,此循环中的每次访问都会被破坏,因为现在i
从5
转移到10
。
您需要重置i
。
如果您使用调试器逐步执行程序,您会注意到这一点。
此外,您的输入长度为11个字符,包括终止空字节,但您只剩下10个空间(char im[5][10]
)。
最后,不要像这样运行I / O循环。在执行任何I / O之前检查EOF是没有意义的。相反,请检查fscanf
的返回值是否成功。