scanf函式格式輸入與隱藏bug問題

2021-10-08 09:06:38 字數 772 閱讀 5856

今天在寫函式的時候,將乙個scanf("%d",&choose) 函式放入進乙個迴圈體,調參時,當我輸入乙個英文本元,因為我設定的格式符號要求是int型,所以輸入是乙個錯誤的格式,當輸出後,奇怪的事情就發生了,迴圈體開始無限迴圈(使用的do{}while();)。然後整個人是懵逼的。乙個格式錯誤就讓迴圈無限重複了?(說不定這也是一種帶開發的神奇用法,這個就當作一種**bug吧)。

然後使用列印,搞清楚輸入後儲存在choose是乙個怎樣的數值,結果列印輸出的choose顯示為0;

printf("%d\n",choose);  0

那零是乙個比較有意思的符號,有兩種可能,當我輸入字母時,scanf()將錯誤的字元輸入到choose中,但我們知道scanf輸入格式錯誤的時候,並不是這樣的機制,所以0就是choose的初始值而已。

然後開始考慮的是緩衝區的滯留。滯留就在scanf();下加個getchar()好咯。

此時問題解決了一半,程式不無限迴圈了。另一半是我輸入得字母有幾個,迴圈進行幾次,在這樣除錯後程式就變得非常人性化了。

然後我多加了幾個getchar()。發現加幾個就會少幾次迴圈,比如加兩個,我輸入得是qqq,就迴圈一次。問題解決

新增一行while((num =getchar() ) != '/n')

問題就非常得人性化了。

問題得深入:

出現這種問題的原因是錯誤輸入的內容會保留在輸入流,下一次判斷會從輸入流開始讀取,因為錯誤輸入的內容還在,所以直接判斷錯誤,繼續迴圈。這是可以使用ffush(stdin)來清理輸入流。或者使用getchar()接受錯誤的字元。

C語言格式輸入函式scanf 詳解

scanf函式稱為格式輸入函式,即按使用者指定的格式從鍵盤上把資料輸入到指定的變數之中。scanf函式是乙個標準庫函式,它的函式原型在標頭檔案 stdio.h 中。與printf函式相同,c語言也允許在使用scanf函式之前不必包含stdio.h檔案。scanf函式的一般形式為 scanf 格式控制...

C C語言格式輸入函式scanf 詳解

scanf函式稱為格式輸入函式,即按使用者指定的格式從鍵盤上把資料輸入到指定的變數之中。scanf函式是乙個標準庫函式,它的函式原型在標頭檔案 stdio.h 中。與printf函式相同,c語言也允許在使用scanf函式之前不必包含stdio.h檔案。scanf函式的一般形式為 scanf 格式控制...

scanf 函式的格式化輸入

函式原型 int scanf const char restrict format,跟printf 一樣,scanf 使用控制字串和引數列表。但和printf 的區別是,printf 函式使用變數名 變數和表示式 而scanf 函式使用指向變數的指標。scanf 函式所用的轉換說明字元與printf...