關於scanf()的緩衝區問題

奇怪的死循環!!

副以下程序:
#include
main()
{int i;
do{
printf("*");
scanf("%d",&i);
}while(1);
}
這個程序非常的簡單.粗看上去沒有什麼,功能就是每打印一個星號後等待用戶輸入一個整形得值,但問題接種而來,用戶一但輸入的是數字外的各種字符,立刻造成死循環.單步執行也無法跳出.但作爲scanf這樣的控制流函數,無論我的輸入是否正確,他都應在下一次執行時停住等待用戶輸入,但問題是它自動執行了. 爲此我做過變量的值跟蹤,發現每次他能自動獲得一個值.且這個值並不是整形量且無序改變.在換了BC編譯以後問題消失.但是當單步執行後問題依舊出現.

當輸入字符的時候,把i的內容輸出來。
可以得知 i的值一直保持不變。(且跳過了scanf函數)。
對於scanf()函數可以想象引發一箇中斷響應。(引出中斷相應表明一點就是此函數調用了中斷----------等待輸入的中斷)
產生這個響應可能需要一個條件,那就是此函數所開闢或者說是爲中斷開闢的緩衝區應是空的!
因此出現這種錯誤的原因可能是緩衝區沒清空。
以‘/n'表示輸入結束(這個說的有不小問題我想,不過爲表示一下這麼說的)
然後編譯系統自動在後面加上清空標誌^Z(ctl+z),以爲下一次調用。
至於輸入字符就陷入跳過這個語句,可能是因爲當初設計這個函數的時候沒有對異常做充分的處理,以至於在讀入第一個字符的時候發現類型不匹配就停止把他後面的清空標誌^Z傳遞到緩衝區域了。(前面可能說的有點問題,應該說是scan)
在執行scanf時候檢查緩衝區是否爲空,爲空的時候執行,否則不執行(在前一次執行scanf函數的時候沒有把緩衝區清空)。
在進行負值的時候出現類型錯誤,跳轉了語句。沒有執行清空語句。(後面所有的scanf語句都不起作用了,包括子程序中的);
整個main程序結束後才清空;
呵呵~~~~~~
亂想着說的!~最近在看彙編和C++就亂講了一點,呵呵!~C++中也經常把cout的優點和scanf的缺點搞出來講!但具體爲什麼會這樣
我想要追究到編譯軟件上面,因爲scanf()不是c 的語句而是編譯軟件接受標準定的一個同名的輸入函數 標準就體現在用相同的名字(也就是聲明部分一樣)。但至於scanf()函數的定義體一不一樣,那就不得而知了!~

不過好象不是這個概念。。。是要維持整形輸入不變。。。這樣的改變不是從實質上解決問題而圍繞了個彎逃避問題。。。SCANF是有緩衝的一個輸入語句。不像GETCHAR那樣能直接獲得一個值。。但問題就處在這個輸入緩衝區了。。它裏面值並沒有被處理掉。當然這個是我通過值跟蹤後和我的導師討論出來的結果。。。。。我是想問一下誰能有經驗的話分析一下這個問題的真正錯誤在什麼地方。。如何解決。。我初步覺得應該用匯編。。但是具體的分析和邏輯上還有點亂。。

解決方法:fflush(stdin);在scanf的前面加了一個語句(用來清空鍵盤輸入的緩衝區)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章