版權聲明:本文為博主原創文章,轉載請附上博文鏈接。
在C語言中當從標准輸入設備輸入字符串時,可以使用gets()和scanf()函數。
gets()和scanf()函數都是C語言標准庫中的函數,但是適用情況是不同的。
1. 功能
二者都是從終端(即標准輸入設備)讀入字符串。
函數 | 功能說明 |
gets(buff) | 讀入一行,並將換行符轉換為字符串結束符 |
scanf("%s",buff) | 讀入一個字符串,遇到空白字符(包括空格、制表符、換行符)時均會停止輸入 |
2. 區別
1)終止條件不同:
函數 | 終止字符 | 輸入字符串 | buff內容 |
gets(buff) | "\n" | "test string\n" | "test string" |
scanf("%s",buff) | " "(space)|"\t"|"\n" | "test string\n" | "test" |
2)終止字符處理不同:
函數 | 如何處理終止字符 | 輸入字符串 | 再次調用getchar()返回結果 | 結果 |
gets(buff) | "\n"不會留在緩沖區中 | "test\nstring" | 's' | ![]() |
scanf("%s",buff) | "\n"會留在緩沖區 | "test\nstring" | '\n' | ![]() |
3. 注意事項
- gets()函數經常和puts()函數配對使用,puts()函數用於顯示字符串,並自動在字符串后面添加一個換行標志
'\n';
- gets()函數存在一個嚴重的缺陷,這個缺陷就是:它不會檢查數組是否能夠裝得下輸入行。
- 可以使用C語言中的gets_s()和fgets()函數來代替gets()函數。
有的編譯器調用gets函數時會給出warning信息: warning: this program uses gets(), which is unsafe.
這是由於gets()函數沒有指定輸入字符大小,所以會無限讀取,如果輸入的字符串過長,會導致緩沖區溢出(buffer overflow),即多余的字符超出了指定的目標空間。gets()函數就會訪問未被分配的內存空間,如果這些內存未被使用,不會立即出現問題;如果這片空間已經存有數據,就會擦除掉程序中的其他數據,會導致程序中止。
在C99標准中,已經不再建議使用gets()函數,而在C11中則是直接拋棄了這個函數。然而在實際應用中,編譯器為了兼容以前的代碼,大部分都繼續支持gets()函數。
C11標准新增了gets_s()函數可以代替gets()函數,但是,該函數是stdio.h輸入輸出函數系類中的可選擴展,因此,即使編譯器支持C11標准,也有可能不支持gets_s()函數。
除此以外,我們可以用c語言中的fgets()函數來代替gets()。
綜上所述,我們推薦總是使用fgets()函數讀取字符串。
參考資料:
- https://zhidao.baidu.com/question/290403568.html
- https://www.cnblogs.com/aexin/p/3908003.html
- https://blog.csdn.net/libing403/article/details/73010866