为什么我在这里收到 NZEC 错误

Why do I get NZEC error here?

本文关键字:NZEC 错误 在这里 为什么      更新时间:2023-10-16

我的代码在这里-

     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();
    }
}

它通过得很好。为什么?

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

您的while(ch!='n')将循环直到"",无论键入的字符数如何。如果键入的字符数多于 m 指向的字符缓冲区中的空间,则可能会损坏内存。 当然,在第二种情况下,len会避免这种情况。

请注意,在这两种情况下,您都无法确保缓冲区的空终止符。 因此,如果您将m处理为 c 字符串,您可能还没有足够的内存或溢出,因为字符串可能非常长。

你有没有考虑过将你的函数定义为:

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