2017-02-28 3 views
-3
{ 

int n; 
cin>>n; 
cout<< n; 

} 

any alphabet or special character을 입력하면 출력은 0입니다.int 데이터 형식의 cin 기능에 혼란이 있음

C에서 나는 scanf();printf()을 사용하지 않았습니다. 해당 ASCII 값을 인쇄합니다.

왜 이런 일이되고 있습니까?

+0

당신은에 대한 문서를 확인 했 '>>'의 int 과부하? 그리고 주목해라, C! = C++. – Carcigenicate

+1

값을 입력 한 후'cin'의 상태를 확인할 수 있습니다. πάνταῥεῖ COUT @ –

+0

<< cin.fail(); 1을 준다; num이 0 일 때만 0을 반환합니다. 왜 실패 했는가? – MELWIN

답변

0

C 및 C++에서 정수를 입력 할 때 드라이버 입력 기능은 숫자가 아닌 문자가 읽힐 때까지 숫자 문자를 읽습니다.

예를 들어, 시퀀스는 "123GHI"123 값을 반환한다.

+0

대신에 정확한 용어를'return'입니까? –

+0

저는 입력 프로세스가 함수이고 일반적으로 함수가 값을 반환하기 때문에 그렇게 믿습니다. –

+0

"* ** 출력 ** 값 123 *"이 더 정확합니다. 출력 값은 항상 함수 반환 값에있는 것은 아니며, 파싱 된 값이 반환 값이 아닌 참조 매개 변수를 통해 출력되기 때문에 결과가'operator >> '의 경우와 같습니다. –

1

설명하십시오 왜 이런 일이 무엇입니까? std::istream& operator>>(std::istream&, int)documentation에서

이 언급 한 것 (강조 광산) : (숫자가 예상되는 곳에 문자가 입력 된 경우 예)

추출에 실패하면

, 값이 수정되지 않은 남아 failbit이 설정됩니다.

는 C++ (11) 코드의 경우는 초기화가 보장되는 것 같다

추출에 실패 할 경우, 제로 값으로 기록되고 failbit가 설정됩니다. 추출 결과가 값이 너무 크거나 작아 값에 맞지 않으면 std::numeric_limits<T>::max() 또는 std::numeric_limits<T>::min()이 기록되고 failbit 플래그가 설정됩니다. 당신은 당신의 코드의 디버그 빌드를 실행 추측 된

n 아마 자동으로 0로 초기화되지만, 그것은 당신이 설명하는 경우 initalized되지 이후 기술적 접근은, 정의되지 않은 동작입니다.

당신은 실패 수를 추출 중에 발생한 경우 입력이 감지 후 cin의 상태를 확인하기 위해, 또는 당신이 안전하게 지금 초기화 값을 사용할 수있는 경우 :

int n; 
std::cin >> n; 
if(std::cin) { 
    std::cout << n << std::endl; 
} 
else { 
    std::cin.clear(); // Clear the streams fail state 
    std::string dummy; 
    std::cin >> dummy; // Consume the non numeric input 
    std::cout << "Wrong input, '" << dummy << "' is not a number." 
} 
+1

@Quentin THX, 저 처방으로 거기서 괴롭 혔습니다. –

+0

C++ 11 이상에서는 동작이 약간 다릅니다. "* 추출에 실패하면 ** 값에 **가 쓰여지고 failbit은 설정됩니다. *" –

+0

@remy 채택했습니다. –

관련 문제