2014-11-21 51 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