我正在尝试使用以下代码
读取文件并将文件内容存储到三个不同的数组中#include<stdio.h>
# define max 10
int main()
{
char filename[10];
int at[max],n=0,i;
float bt[max];
char pno[max][2];
printf("Enter the file name :- ");
scanf("%s",filename);
FILE *fp=fopen(filename,"r");
while(fscanf(fp, "%s %d %f" ,pno[n],&at[n],&bt[n])!=EOF)
n++;
for(i=0;i<n;i++)
printf("%s\t%d\t%f\n",pno[i],at[i],bt[i]);
return 0;
}
我的输入文件是:
p1 0 20.0
p2 2 15.0
p3 6 27.0
p4 4 36.0
我的输出是:
p1p2p3p4 0 20.000000
p2p3p4 2 15.000000
p3p4 6 27.000000
p4 4 36.000000
我不知道为什么在输出的第一行和p1,p2p3p4和2和3行相同。
答案 0 :(得分:3)
请记住,C中的字符串有一个特殊的终结符,所以两个字符的字符串实际上需要三个字符长。
如果没有终结符字符的空间,那么fscanf
调用会将该特殊终结符写入数组的边界之外,从而导致未定义的行为。
修复非常简单,将pno
的声明更改为:
char pno[max][3];
您可能还想更改fscanf
调用,以确保它不会尝试在数组中存储两个以上(不包括终结符)字符:
fscanf(fp, "%2s %d %f" ,pno[n],&at[n],&bt[n])
如果输入文件以某种方式损坏,这将有所帮助。
您可能还想将条件更改为例如
while (fscanf(...) != 3)
因为它也会检测输入文件的问题。