C/C++——字符串輸入gets與scanf的比較


版權聲明:本文為博主原創文章,轉載請附上博文鏈接。

 

在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()函數讀取字符串。

 

 


參考資料:

  1. https://zhidao.baidu.com/question/290403568.html
  2. https://www.cnblogs.com/aexin/p/3908003.html
  3. https://blog.csdn.net/libing403/article/details/73010866

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM