2010-01-06 2 views
0

숫자를 입력하지 않으면 (즉, 's') 이유는 알 수 없습니다. 이유는 무엇입니까? cin >> W;이 생략되었습니다.3 단계의 std :: cin이 생략 된 이유는 무엇입니까?

#include <cstdlib> 
#include <iostream> 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    short W = -1; 

    cout << "step 1) W = " << W << endl; 
    cout << "give a number: "; 
    cin >> W; 

    if (cin.fail()) 
    { 
    cout << "ERROR, bad number" << endl; 
    W = -1; 

    cout << endl << "step 2) W == " << W << endl; 
    cin.clear(); 
    } 

    cout << endl << "step 3) W == " << W << endl; 
    cout << "give a number: "; 
    cin >> W; 

    cout << endl << "step 4) W == " << W << endl; 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 
+0

이 코드는'cin >>'과'cout <<'을 사용해야하는 방법에 더 가깝다고 생각합니다. 말할 것도없이, 그것은 끔찍한 코드입니다; 그래서 그것을 당신의 영감으로 사용하지 마십시오. – notnoop

+0

notnoop : 어쩌면 그것은 무섭다.하지만 왜 그런 식으로 작동하는지, 왜 그렇게 끔찍한 지 보지 않는지 이해하고 싶다. – qlf00n

+0

Steffen의 대답을 받아들이는 것을 잊지 마라. 문제가 해결 되었다면. – Bill

답변

3

1 단계에서 비 번호를 입력 한 다음 3 단계가 작동하지 않는 경우가 예상됩니다.

문제는 cin.clear()가 스트림의 오류 플래그 만 지우는 것입니다. 잘못된 입력이 스트림에서 제거되지 않으므로 다음 cin >> W은 잘못된 입력을 다시 읽습니다.

예를 들어 cin에서 모든 것을 취하는 문자열을 채우거나 cin.ignore()을 사용하여 입력 스트림에서 다음 문자를 무시할 수 있습니다.

자세한 내용은 http://www.arachnoid.com/cpptutor/student1.html을 참조하십시오.

+0

문제는 내가 블록 안에있는 경우 하나 또는 두 개의'cin.ignore();'를 넣으려고했는데 작동하지 않는 것 같습니다. 그래서 '어떻게 작동하는지'에 대해 혼란 스럽습니다. – qlf00n

+0

ok ** linebreak ** ** linebreak ** ** linebreak ** ** linebreak ** ** linebreak ** ** linebreak ** ** linebreak ** ** linebreak ** ** linebreak ** ** linebreak ** ** linebreak ** ** linebreak ** ** linebreak ** ** linebreak ** ** linebreak ** ** linebreak ** ' .. 이제 게시글을 닫을 수 있습니다. – qlf00n

관련 문제