为什么我在这里得到NZEC错误?

时间:2014-11-21 20:11:30

标签: c++ input runtime-error

我的代码 -

     void input(char* m)
{
    char ch;
    do
    {
        ch=getchar();
    }
    while(ch=='\n');
    int i=0;
    while(ch!='\n')
    {
        m[i++]=ch;
        ch=getchar();
    }
}

给出NZEC错误。但是,如果我使用字符数 len 限制输入,例如 -

void input(char* m, int len)
{
    char ch;
    do
    {
        ch=getchar();
    }
    while(ch=='\n');
    int i=0;
    while(ch!='\n'&&i<len-1)
    {
        m[i++]=ch;
        ch=getchar();
    }
}

它顺利通过。那是为什么?

1 个答案:

答案 0 :(得分:0)

在第一种情况下,您有缓冲区溢出!

无论输入的字符数是多少,您的while(ch!='\n')都会循环直到'\ n'。如果键入的字符数多于m指向的字符缓冲区中的空格,则可能腐败的记忆。当然,在第二种情况下,len将避免这种情况。

请注意,在这两种情况下,都不能确保缓冲区的空终止符。因此,如果您将m作为c-string处理,您可能也会得不到足够的内存或缓冲区溢出,因为字符串可能会非常长。

你有没有考虑将你的功能定义为:

void input(std::string& m) {
    // ...
    m.push_back(ch); // instead of m[i++]=ch 
    // ...  
}