gets() 和 fgets() gets()
獲取函數原型:char*gets(char*);//讀取字符到數組:gets(str); str 是數組名稱。
獲取函數功能:從鍵盤輸入字符,收到換行符或EOF時停止,并將讀取結果存放到指針指向的字符數組中。
讀取的換行符將轉換為空值作為字符數組的最后一個字符以終止字符串。
注意:由于gets函數沒有指定輸入字符大小,因此會無限讀取。 一旦輸入的字符大于數組的長度,內存就會越界。
導致程序崩潰或者其他數據錯誤。
fgets()
fgets函數原型: char *fgets(char *s, int n, FILE *);//我們通??梢赃@樣使用:fgets(str, (str), stdin);
其中,str是數組的首地址,(str)是數組的大小,stdin表示我們從鍵盤輸入數據。
fgets函數的作用:從文件指針中讀取字符,存放到以s開頭的空間中,直到讀完N-1個字符,或者讀到一行。
注意:調用fgets函數時,最多只能讀取n-1個字符。 讀取后系統會自動在末尾添加'\0'并返回str作為函數值。
借用教程示例,我將 char str[100] 更改為 char str[5]
#includeint main( ) { char str[5]; printf( "Enter a value :"); gets( str ); printf( "\nYou entered: "); puts( str ); return 0; }
如果輸入123(長度小于5),結果為:
Enter a value :123 You entered: 123
如果輸入(長度大于5)結果為:
Enter a value :123456789 You entered: 123456789
雖然顯示正常,但系統提示程序崩潰
如果gets()函數不能正確使用,危害將會很大。 上面我們看到,當輸入字符串的長度大于緩沖區的長度時,不會被截斷,讀取的字符串會原樣輸出。 導致程序崩潰。
考慮到程序的安全性和健壯性,建議使用fgets()而不是gets()。 喜歡:
#includeint main( ) { char str[5]; printf( "Enter a value :"); fgets( str,5,stdin ); //fgets()函數; printf( "\nYou entered: "); puts( str ); return 0; }
183***
參考地址