2014-10-05 41 views
4

我是C++的新手,我想知道布爾數據情況下的函數cin是如何工作的。 比方說,比如:Cin和布爾輸入

bool a; 
cin >> a; 

我明白,如果我給0或1,我的數據會是真或假。 但是,如果我給另一個整數或甚至字符串會發生什麼?

我正在下面的代碼:

#include <iostream> 
using namespace std; 

int main() { 
bool aSmile,bSmile; 
cout << "a smiling ?" << endl; 
cin >> aSmile; 
cout << "b smiling ?" << endl; 
cin >> bSmile; 
if (aSmile && bSmile == true) 
{ 
    cout << "problem"; 
} 
else cout << "no problem"; 

return 0; 
} 

如果我給的0或1的值兩個布爾,是沒有問題的。 但如果我再舉個整數,這裏是輸出:

a smiling ? 
9 
b smiling ? 
problem 

我不要求輸入任何價值bSmile行「CIN >> bSmile」似乎被跳過。 同樣的情況發生,如果我給aSmile一個字符串值。

發生了什麼事?

Thx guys! :)

+2

嘗試cin.clear()後,在aSmile – Nooble 2014-10-05 14:27:06

+0

此代碼是失敗()錯誤檢查。 – 2014-10-05 14:28:50

+0

相關:http://stackoverflow.com/questions/24504582/test-whether-stringstream-operator-has-parsed-a-bad-type?noredirect=1#comment37965807_24504582 – 2014-10-05 14:33:46

回答

4

cppreference

如果v類型是boolboolalpha未設置,那麼,如果要被存儲的值是0​false被存儲時,如果要被存儲的值是1,true被存儲,對於任何其他值std::ios_base::failbit被分配給err並且true被存儲。

由於您輸入了不01(或者甚至"true""false")流設置一個錯誤位在其流狀態,防止你執行任何進一步的輸入的值。

clear()應在讀入bSmile之前調用。此外,這是你爲什麼總是檢查你的輸入是否滿足條件的一個很好的理由。

+1

它可能值得添加,你可以犯錯誤例外情況更明顯:http://www.cplusplus.com/reference/ios/ios/exceptions/ – matsjoyce 2014-10-05 14:42:28

+0

非常感謝。使用cin.clear在bSmile輸入之前可以用於其他整數,但它仍然不適用於字符串! – Xema 2014-10-05 15:07:01

+0

@Xema「不工作」非常模糊,你需要顯示代碼和行爲。 – 0x499602D2 2014-10-05 15:27:27