我编写了一个程序来扫描文件中的数字,并查找每个数字的出现次数。它有效,但最多只有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);
}
答案 0 :(得分:1)
除了[已在其他答案和评论中指出]的其他逻辑问题,我可以在您的代码中看到
(arr[i])++;
arr[i]
指向无效的内存位置,因为i
循环后for
的值未被重置。所以,基本上你是在访问越界内存并面对 off-by-one 错误。这将导致undefined behaviour。
注意:
for(i=1;i<101;i++)
中,循环应该从0
开始,因为C数组的起始索引为0
。fopen()
是否成功。答案 1 :(得分:1)
除了指出的EOF问题外,我还将逐行检查代码的4行部分。在第一行fscanf()
将i
设置为从文件中读取的数字作为文本。
fscanf(fp,"%d",&i);
在下一行中,您尚未测试i
的值,如果i < 0
或i > 100
,则会破坏数组。
(arr[i])++;
下一行确定数字中有多少位数。
c=numOfDig(i);
假设文件包含序列&#34; a0&#34;。然后重新定位文件指针,但如果数字c == 0
,您将获得无限循环,因为文件指针将重绕2并重新读取相同的序列。
fseek(fp,c-2,SEEK_CUR);
这是因为您的函数numOfDig()
不正确。传递0
后,它会返回0
而不是1
。
答案 2 :(得分:0)
问题在于逻辑。你只计算'\n'
符号,但文件中的最后一行最后没有这个符号。将条件更改为if(ch == '\n' || ch == EOF) numLines++;