在文件count.c中,程序从文件中读取字符串,然后计算文件中给出的字符总数。以下是文件count.c中的代码行:
#include <stdio.h>
int main()
#define max 1000
{
char c, inpt[max];
int i;
for (i=0; (c=getchar()) !='\n'; ++i){
inpt[i]=c;
}
printf("Count is %d. ",i);
}
代码编译成功,没有任何错误消息,但是当我运行命令时:
count.exe < Rehan.txt
程序崩溃说'count.exe has stopped working'
。
问题详情如下:
Problem signature:
Problem Event Name: BEX
Application Name: count.exe
Application Version: 0.0.0.0
Application Timestamp: 53e5d5d5
Fault Module Name: StackHash_e98d
Fault Module Version: 0.0.0.0
Fault Module Timestamp: 00000000
Exception Offset: ffffffff
Exception Code: c0000005
Exception Data: 00000008
OS Version: 6.1.7600.2.0.0.256.1
Locale ID: 1033
Additional Information 1: e98d
Additional Information 2: e98dfca8bcf81bc1740adb135579ad53
Additional Information 3: 6eab
Additional Information 4: 6eabdd9e0dc94904be3b39a1c0583635
答案 0 :(得分:1)
如果你的文件有一行,你的程序将永远循环,同时,检查i < max - 1
,尝试:
for (i = 0; i < (max - 1) && (c = getchar()) != EOF && c != '\n'; ++i)
{
inpt[i] = c;
}
那么尾随0呢?如果你想要一个有效的字符串,NUL会终止inpt
:
inpt[i] = '\0';
答案 1 :(得分:1)
这是一个缓冲区溢出异常。显然Rehan.txt是前1000个字符中没有'\n'
字符的文件,因此循环尝试为inpt[i]
的值大于999写入i
。您可以防止这种情况发生通过检查EOF以及i < 1000
条件,以便对于大于缓冲区的文件不会出现相同的错误。
最后,如果这是所有这个程序需要做的,请考虑完全取消inpt
。您的代码写入此缓冲区但未从中读取。
答案 2 :(得分:1)
1.-文件没有\ n
2.-文件长度超过1000
你应该注意程序没有到达文件末尾。
您的计划已重新制作。
#include <stdio.h>
int main()
#define max 1000
{
char c, inpt[max];
int i;
bool bEnd=false;
for (i=0; !bEnd; i++)
{
c=getchar();
if(c=='\n' || c==EOF)
{
inpt[i]=0;
bEnd=true;
}
else
{
inpt[i]=c;
}
}
printf("Count is %d. ",i);
}