2013-12-23 19 views
0

我有了這個功能,我創建:功能需要推杆有限長度的字符串不能很好地工作

void getWords(int words){ 
    int remaining, error=0; 
    char word[WORD_MAX+1], def[DEF_MAX+1]; 

    for(remaining = words;remaining > 0;remaining--){ 
     do{ 
      printf("Enter definition #%d out of %d:\n",((words+1) - remaining),words); 
      gets(word); 
      if(strlen(word) > WORD_MAX){ 
       error = 1; 
       printf("\nError! '%s' contains %d characters | Maximum allowed: %d | Please try again...\n\n",word,strlen(word),WORD_MAX); 
      } 
     }while(error); 
    } 
} 

它做什麼,如果字符串的長度最多爲「WORD_MAX它應該做的基本上,支票'字符長,如果不要求用戶再次這樣做, 我的問題是這樣的:

當我測試它與WORD_MAX 3並試圖寫一個6字符長的字符串它完美的作品,但是當我試圖寫一個非常長的字符串,例如20個字符長,它只寫了一些字,最後帶有一些奇怪的ascii笑臉,剩下的變量wh ich包含我要求函數輸入的單詞的數量以獲得一些垃圾值,並且它毀壞了整個程序,爲什麼它會這樣做?

謝謝!

回答

3

正如您所注意到的,無法通過gets避免緩衝區溢出。作爲替代方案,你可以使用fgets

fgets(word, WORD_MAX+1, stdin); 

從它man page

字符*與fgets(字符* S,INT大小,文件*流);
fgets()從 中讀取最多一個小於流中的大小字符,並將它們存儲到由s指向的緩衝區 中。

+0

有沒有辦法阻止它使用正常獲取func? – argamanza

+0

不,沒有辦法防止使用'gets'溢出。 'stdin'流的'fgets'相當於'gets',沒有溢出漏洞。 – simonc

+1

@argamanza您無法指定'gets'的讀取大小。它讀取一個換行符或直到文件結束,所以緩衝區溢出幾乎是不可預知的。 – 2013-12-23 15:21:09

相關問題