2014-11-21 52 views
0

我的代码这里 -为什么我在这里得到NZEC错误?

 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

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

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

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

你有没有想过你定义功能:

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

字符串的值是事先知道的。它不会超过缓冲区。但是我想知道的是,如何添加长度参数来避免运行时错误?他们仍然可能是缓冲区溢出。 – goelakash 2014-11-21 22:03:14

+1

由于在长度参数中传递了缓冲区的最大长度,并且当到达它们时循环会完成,即使它仍然没有'\ n'。 – Christophe 2014-11-21 22:40:25

+0

理论上,长度参数可以是任意的。它可能会超过缓冲区大小。我理解语法。 – goelakash 2014-11-22 15:25:16