从C中读取文件时出现Bex错误

时间:2014-08-09 08:47:42

标签: c windows-7-x64

在文件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

3 个答案:

答案 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);
}