關於scanf()讀取與返回值和回車鍵的問題


 

今天老師檢查的時候說如果一個鏈表為空(簡單的說就是while(scanf())一開始沒輸入數字就按回車的話會進入死循環)的情況,

我當時有點懵,因為文檔里強調為空的情況。還好老師叫我自己現場實現一下,

當時想了兩個方案:

   *一是用getchar()接受第一個回車(我設定的輸入回車結束),如果用戶第一個鍵盤輸入就是回車,它能工作的很好。

 

 

 

但是當第一個鍵盤輸入不是一個回車的時候,就遇到一個問題:getchar()會吃掉第一個數字

的一部分,之所以說一部分是因為經過我測試發現:

 

 

 

Getchar()能返回的值最大為57,這顯然是不合理的。

 

於是我想到了第二個方法:

   *先用getchar讀取,如果getchar讀取的不是回車,就將它重新放回緩沖區,再又scanf()函數來

讀取。但是這個方案有點麻煩,還要區查資料,搞明白怎么將讀取的數據重新放回緩沖區。好的

是在我采取這個方案之前我想到了更好的辦法:

 

第三個辦法:

   *將結尾判斷改一下直接上圖,待會解釋原理

 

 

我對這個函數做了兩處改動,第一個和第三個箭頭。

第一個改動是把Enter鍵改成了q鍵,因為回車會刷新緩沖區,而scanf()函數一直在等待一個數字,

所以在一開始狂按回車是沒用的,解決方案就是把回車換成一個字符(q可以代表quit,所以用q,

其他字符也可以)。程序遇到用戶輸入的q時,圖片中函數里的u等於0,所以退出whlie語句。

第二個改動是在兩個while語句之間加了一個getchar(),他的作用是:當用戶輸入q時,第一個while

里面的scanf函數是沒有讀取到這個q的,,如果沒有這個getchar,那么用戶輸入的q將由第二個

scanf函數來讀取。這樣第二個while 語句就不會運行。

這樣,程序就能滿足輸入為空表的情況了。

 


免責聲明!

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



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