scanf和cin輸入型別不匹配時造成的死迴圈問題

2021-06-22 05:12:53 字數 955 閱讀 6058

**

下面兩段**要實現的功能是往整數變數i中輸入乙個資料,輸入數字1時退出,然而當輸入乙個字元時,整個程式會變成乙個死迴圈。

c++**:

int i=0;

while (i!=1)

c語言**:

int i=0;

while (i!=1)

原因:

造成死迴圈的原因也很簡單,當第一次通過scanf函式讀入整數時,如果我們輸入的是乙個字元,那麼scanf將會什麼都不讀,直接返回0,輸入錯誤提示資訊後再次呼叫scanf讀取時,由於我們上次輸入的字元依舊在輸入緩衝區裡,所以scanf不需要等使用者輸入就

直接返回0

,然後第三次……第四次……這就是死迴圈的原因了。

而c++用std::cin讀取整型數字的時候也會出現scanf函式的問題,當輸入不是整數時,它也是直接返回,下次就死迴圈了。

解決辦法:

那怎麼解決呢?也很簡單,只要在for迴圈內部呼叫scanf函式前新增一句fflush(stdin)來強制重新整理輸入緩衝區就可以了,這樣輸入緩衝區裡就又是空的了,所以scanf會等待使用者輸入。

c++語言中,在呼叫cin前可以先呼叫cin.clear()和cin.sync(),單獨呼叫乙個是沒有用的。

其實cin.clear()的作用並不像它的名字一樣,當程式想要去讀乙個int型卻讀到了乙個char型輸入的時候,cin就會將自己的內部錯誤識別符號設定為ios::failbit(沒有錯誤是ios::goodbit),cin.clear()的作用不是清空輸入緩衝區,而是清空這個內部錯誤識別符號,真正清空輸入緩衝區的是cin.sync(),但是只清空緩衝區也不行,因為內部錯誤識別符號還保留著呢,下次讀取的時候一看上次有錯誤,這次根本不讀了……所以一定要一起呼叫。

改正後**:

int i=0;

while (i!=1)

int i=0;

while (i!=1)

參考:

scanf和cin的差異

引例 大家都知道,在c 中有兩種輸入 輸出方式 scanf和cin,但是,它們之間存在的差異,你們知道麼?下面請看測評吧!測試題目 輸入n個數,輸出n個數。測試環境 ubuntu12.04 i3cpu 4g記憶體 7200轉硬碟 測試結果 測試結果使用linux的time測試時間,結果如下 1000...

Scanf的輸入型別

scanf的輸入型別 1.格式字元與printf函式中的使用方式相同,以 d o x c s f e,無 u格式 g格式。2.可以指定輸入資料所佔列寬,系統自動按它擷取所需資料。3.後的 附加說明符,用來表示跳過它相應的資料。4.輸入資料時不能規定精度。5.根據格式字元的含義從輸入流中取得資料,當輸...

scanf 函式的引數輸入型別不匹配問題

scanf 函式的引數輸入型別不匹配問題 這是我在csdn論壇上見到的問題,這個錯誤有時候會讓人莫名其妙。include main 當輸入a 回車 後,會直接跳過下面 個scanf語句,直接輸出為 123 t 原因 對於scanf d c a,c scanf語句執行時,首先試圖從緩衝區中讀入乙個 d...