2013-08-02 1 views
0

아래의 코드는 입력이 한 번 입력 될 때마다 "Not a number"를 표시해야합니다.캐치 ios :: failure 반복 루프

int input; 
while (1 == 1){ 
    cout << "Enter a number: "; 
    try{ 
     cin.exceptions(istream::failbit); 
     cin >> input; 
    }catch(ios::failure){ 
     cout << "Not a number\n"; 
     input = 0; 
    } 
} 

문제는 (이 숫자가 아닌 경우) 캐치가 호출 될 때 는 동안() 루프가 여러 번 실행 된 경우처럼하지만, 새로운 요구하지 않고 끝없이 "잘못된 번호"를 표시한다는 것입니다 입력.

+0

당신은 정말로 참고로 붙잡아 야합니다 –

답변

3

while(true) 또는 while(1) [또는 for(;;)]은 "영원히 루프"를 만드는 관습 방법입니다.

cin 스트림에서 허용되지 않는 입력을 "정리"해야합니다. 일반적인 접근 방법은 cin.ignore(1000, '\n');을 호출하여 다음 줄 바꿈 [최대 1000 자까지 선택할 수 있습니다. 더 큰 숫자를 선택할 수 있지만 대개 1000은 "줄 바꿈을하기에 충분합니다"

거의 확실하게도 (Potatoswatter에게 감사함) 입력에 cin.clear();을 호출하여 failed 상태를 제거해야 다음 입력이 성공할 수 있습니다. [cin.ignore()이 더 입력되기 때문에 그 전에 처리해야합니다.]

+2

또는'std :: cin.ignore (std :: numeric_limits :: max(), '\ n'); ' –

+2

그래,하지만 그게 다야. 기억하기에는 지루해 ...;) –

+2

'cin.clear()'도 도움이 될 수 있습니다. – Potatoswatter

0

그래. try-catch 문은 루프 안에 있습니다. 그래서 무언가를 시도해보십시오. 실패하고 예외가 발생하면 예외를 잡아 내고 루프에서 빠져 나가거나 다시 돌아 오지 않으므로 같은 일을 반복해서 수행하게됩니다.

하지만 입력이 처음 처리되지 않았으므로 (대신) 예외가 처리되었으므로 두 번째 또는 세 번째 또는 임의의 시간에 처리되지 않습니다. 일반적으로, 그런데

int input; 
while (1 == 1){ 
    cout << "Enter a number: "; 
    try{ 
     cin.exceptions(istream::failbit); 
     cin >> input; 
    }catch(ios::failure){ 
     cout << "Not a number\n"; 
     input = 0; 
     //the line below ignores all characters in cin until the space (' ') 
     //(up to 256 characters are ignored, make this number as large as necessary 
     cin.ignore(256, ' '); 
    } 
} 

: 발전하려면

, 다음 공간까지 입력을 무시하여 예외를 처리 예외가 오버 헤드가 특히 때문에, 진정으로 특별한 뭔가를해야한다 예외 처리 용. whether invalid user input is exceptional에 대한 논쟁이 있습니다.

는 다른 방법으로, 다음과 같은 예외없이 훨씬 더 작고, 똑같이 올바른 루프를 만들 수 있습니다

int input; 
while (true){ //outer while loop that repeats forever. Same as "while(1 == 1)" 
    cout << "Enter a number: "; 
    //The following loop just keeps repeating until a valid value is entered. 
    //The condition (cin >> input) is false if e.g. the value is a character, 
    //or it is too long to fit inside an int. 
    while(!(cin >> input)) { 
     cout << "Not a number" << endl; 
     input = 0; 
    } 
} 
+0

이상한, 나는 이것에 대해 3 개의 downvotes을 얻었는데, 그것은 결국 취소되었습니다 ... 나는 무엇인가 놓치고 있습니까? – maditya

+0

당신은 무엇을 제안합니까? – zurfyx

+1

스트림이 잘못된 입력을 지나서 진행되지 않는 이유 또는 문제를 해결하는 방법에 대해 말하지 않습니다. 귀하의 대답의 첫 번째 버전은 입력에 대해 전혀 말하지 않았습니다. – user2357112

1

스트림에서 문자를 int으로 추출하지 못했지만 해당 문자는 스트림에 남아 있으므로 대신 다른 것으로 추출하려고 시도 할 수 있습니다.

완전히 건너 뛰려면 catch 블록 안에 std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');을 실행하십시오.

사용자가 입력 한 내용이 모두 이면이 스트림의 첫 번째 것입니다. 그리고 아마도 그 숫자가 될 것이기에, int으로 추출하려는 다음 시도가 성공할 것입니다.