**
下面兩段**要實現的功能是往整數變數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...