2014-10-05 95 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