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包含我要求函數輸入的單詞的數量以獲得一些垃圾值,並且它毀壞了整個程序,爲什麼它會這樣做?
謝謝!
有沒有辦法阻止它使用正常獲取func? – argamanza
不,沒有辦法防止使用'gets'溢出。 'stdin'流的'fgets'相當於'gets',沒有溢出漏洞。 – simonc
@argamanza您無法指定'gets'的讀取大小。它讀取一個換行符或直到文件結束,所以緩衝區溢出幾乎是不可預知的。 – 2013-12-23 15:21:09