2014-10-05 3 views
4

저는 C++을 처음 접했고 부울 데이터의 경우 cin이 어떻게 작동하는지 궁금합니다. 의이 예를 들어 가정 해 봅시다 :Cin 및 Boolean 입력

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의 값을주는 경우에, 아무런 문제가 없습니다. 내가 bSmile에 값을 입력하도록 요구하고 있지 않다

a smiling ? 
9 
b smiling ? 
problem 

라인 "CIN >> bSmile"는 제외 될 것으로 보인다 : 나는 또 다른 정수를 주면 는하지만, 여기에 출력됩니다. aSmile에 문자열 값을 주면 같은 일이 발생합니다.

무슨 일이 일어 났습니까?

Thx 얘들 아! :)

+2

aSmile을 가져 와서 cin.clear()를 시도하십시오. – Nooble

+0

이 코드는 오류 검사를 위해 fail()입니다. –

+0

관련 항목 : http://stackoverflow.com/questions/24504582/test-whether-stringstream-operator-has-parsed-a-bad-type?noredirect=1#comment37965807_24504582 –

답변

4

cppreference에서 :

v의 유형 bool하고 boolalpha가 설정되지 않은 경우, 저장되는 값이 0​의 경우는 값이 저장 될 경우 다음 false이 저장되어있다 1, true이 저장되고 다른 값인 std::ios_base::failbiterrtrue에 저장됩니다.

는 스트림이 더 이상의 입력을 수행 할 수없는 이유, 그 흐름 상태 에러 비트를 설정 0 또는 1 (또는 "true" 또는 "false") 아니었다 값을 입력하기 때문이다.

clear()bSmile으로 읽기 전에 호출해야합니다. 또한 입력이 스트림 자체에서 조건부로 성공했는지 항상 확인해야하는 이유가 여기에 있습니다.

+1

오류를 추가 할 수도 있습니다. 예외가있는 경우보다 분명합니다. http://www.cplusplus.com/reference/ios/ios/exceptions/ – matsjoyce

+0

고마워요. bSmile 입력 전에 cin.clear를 사용하면 다른 정수에서도 작동하지만 여전히 문자열에서는 작동하지 않습니다! – Xema

+0

@Xema "Not working"은 매우 모호합니다. 코드와 동작을 보여줘야합니다. – 0x499602D2