我编写了一个程序来逐行扫描文件中的数字,并查找每个数字出现的次数。它可以工作,但最多只能 33 行。如果我的文本文件有 34 行及以上,它不会响应。我可以知道是什么问题以及需要做什么吗? 这是代码:`
#include<stdio.h>
#include<conio.h>
int numOfDig(int);
int numOfLines(FILE*);
main()
{
FILE *fp;
char ch;
int c,i,flag=1,line=1,numLine;
int arr[101];
for(i=1;i<101;i++)
{
arr[i]=0;
}
fp = fopen("new1.txt","r");
numLine=numOfLines(fp);
fclose(fp);
fp=fopen("new1.txt","r");
while(line<=numLine)
{
ch=fgetc(fp);
while((ch=fgetc(fp)!=10))
{
fscanf(fp,"%d",&i);
(arr[i])++;
c=numOfDig(i);
fseek(fp,c-2,SEEK_CUR);
}
line++;
}
fclose(fp);
for(i=1;i<101;i++)
{
if(arr[i]!=0)
printf("%d = %d\n",i,arr[i]);
}
getch();
}
int numOfDig(int num)
{
int n=0;
for(n=0;num>0;num/=10)
n++;
return(n);
}
int numOfLines(FILE *fp)
{
int numLines=0;
char ch;
do
{``
ch = fgetc(fp);
if(ch == '\n')
numLines++;
} while (ch != EOF);
printf("%d ",numLines);
return (numLines);
}
最佳答案
除了其他逻辑问题[已在其他答案和评论中指出],我在您的代码中可以看到
(arr[i])++;
arr[i]
指向无效的内存位置,如 i
的值从for
出来后没有被重置环形。因此,本质上您正在访问越界内存并面临off-by-one错误。这将导致 undefined behaviour .
注释:
- 在
for(i=1;i<101;i++)
,循环应从0
开始,因为 C 数组的起始索引为0
. - 始终检查
fopen()
是否成功在访问返回的指针之前。
关于c - 用C读取文件的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28323590/