2 回答

TA貢獻1856條經驗 獲得超17個贊
C++的輸入錯誤檢查機制:
1、在C++中有三個位用來設置錯誤的狀態信息,iso::eofbit當文件到達末尾時則設置該位。ios::badbit當流被破壞時設置該位,這是不可恢復的,比如文件讀取錯誤。ios::failbit如果輸入操作未能讀取到預期的字符或輸出操作沒有寫入預期的字符則設置該位,這是可恢復的。這三個狀態標志設置了不同類型的輸入錯誤
2、為什么需要重設流狀態呢?因為一旦流狀態的其中某一位被設置后,則流將對后面的輸入或輸出關閉,直到流狀態被清除。比如cin>>a;其中a是int型變量,如果這時輸入一個字符d,則會出現設置流狀態failbit位,這可以通過調用good()函數來測試,這時對后面的輸入將會關閉,也就是說如果cin>>a;后面還有一句cin>>b;則語句cin>>b將不會執行。
3、如果希望程序在流狀態位被設置后能夠讀取后面的輸入,則必須將流狀態重置為良好。這可以使用clear()方法來實現。比如cin>>a; cin.clear(); cin>>b;其中變量a是整型。這時如果輸入一個字符d語句cin>>a將使程序設置failbit位,語句cin.clear()將狀態位failbit位清除,接著執行語句cin>>b,這時會發現程序cin>>b;沒有提示輸入,這是為什么呢?原因就在于雖然使用clear()函數重置了流狀態,但是不匹配的輸入仍然留在輸入隊列中,下一次輸入就將從這里讀起,而不會提示用戶輸入內容,而是從輸入流中直接提取,也就是說字符d會直接賦給變量b;如果變量b是字符型的話則接收他,并把字符d賦給b,這里不會提示輸入變量b的值,這不是我們所預期的。如果變量b是整型變量的話,則cin>>b又將是錯誤的。怎樣能在第一次輸入錯誤后讓系統提示用戶為以后的輸入語句輸入內容呢?方法就是使用一個函數來一直讀取輸入流中的字符直到達到空白為止,這可以使用isspace()函數和ignore()函數來實現,篇符所限不講了。
4、使用cin進行簡單輸入:cin是類istream的對象。對于cin輸入,它將跳過空白(空格,換行符和制表符)直到遇到非空白字符,cin將讀取從非空白字符到與目標類型不匹配的第一個字符之間的全部內容。比如有cin<<a;其中a是int,則輸入123 z x時,則只把123賦給變量a,而后面的z x則留在輸入流中,下一次輸入時就將從這里開始讀取,比如再有cin<<b;其中b是char型,則字符z將賦給變量b,這里不會提示輸入變量b的值,這不是我們所預期的,而字符x又將留在輸入流中,在這里不會讀取z前面的空白字符,正如前面所說cin輸入將跳過空白直到遇到非空白字符起才開始讀取。再比如cin<<a;其中a是int,則當輸入3 2 1時,則只有數字3被賦給變量a,因為在數字3后面的空格是與類型int不匹配的類型,在這里就結束輸入。如果再輸入時輸入3.3這樣的數字的話,則同樣的道理,在程序中點符號對于整型來說是非匹配類型,所以只有數字3被輸入給變量a,則后面的字符被留在輸入流中。
順便提一下,你程序中的cin.get(c)對于float類型與C++中的get函數原型中的形參根本就不皮配,使用VC不能通過編序,不知道你的編譯器怎么能編譯通過的。
- 2 回答
- 0 關注
- 325 瀏覽
添加回答
舉報