我的代码 -
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();
}
}
它顺利通过。那是为什么?
答案 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
// ...
}