喜歡的東西
cin >> Delay1;
if(cin) { ... }
不會根據您的規格工作,因爲cin
會跳過前導空白。用戶不能僅僅輸入。他首先必須輸入一些文字。如果他進入以下
3a
然後輸入被讀入雙,上漲到a
,並停止。 cin
將不會發現任何錯誤,並將a
留在流中。通常,這是足夠的錯誤處理,我想。但是如果需要在用戶輸入類似上面的內容時實際重複,則需要更多代碼。
如果你想測試整個輸入到新行是否是一個數字,那麼你應該使用getline
,讀入一個字符串,然後嘗試轉換爲數字
string delay;
if(!getline(std::cin, delay) || !isnumber(delay)) {
...
}
的isnumber
功能使用stringstream的測試串
bool isnumber(string const &str) {
std::istringstream ss(str);
double d;
// allow leading and trailing whitespace, but no garbage
return (ss >> d) && (ss >> std::ws).eof();
}
的operator>>
會吃的空白,以及std::ws
將消耗尾隨空白。如果它碰到流尾,它將發出信號eof
。這樣,您可以立即向用戶發出錯誤信號,而不是在您下次嘗試從cin
讀取時錯誤出現。
編寫一個類似的函數,返回double或將double的地址傳遞給`isnumber,以便它可以在解析成功時寫入結果。
這也是值得看看的各種錯誤標誌和它們如何與operator void*
,operator!
,good()
,fail()
,bad()
和eof()
它可以是相當混亂:
flag | badbit | failbit | eofbit
function | | |
-----------------+---------+-----------+--------
op void* | x | x |
-----------------+---------+-----------+--------
op ! | x | x |
-----------------+---------+-----------+--------
good() | x | x | x
-----------------+---------+-----------+--------
fail() | x | x |
-----------------+---------+-----------+--------
bad() | x | |
-----------------+---------+-----------+--------
eof() | | | x
-----------------+---------+-----------+--------
有如果相應位影響結果則爲x
。轉換爲bool
(if(cin) ...
)時,同時operator!
用於代碼做!cin
@litb:那張桌子很棒! +1 – sbi
我已經向這個人投了票,我希望能再次提高它;) – AraK