2016-09-30 5 views
0

문자를 누를 때 왜 무한 루프가 발생합니까? 오류 검사시 코드가 무한 반복되는 것을 방지하려면 어떻게합니까? 표준 : CIN 안전 타입이기 때문에문자를 누를 때 왜 무한 루프가 발생합니까? 오류 검사를 위해 어떻게 변경합니까?

#include <iostream> 
using namespace std; 

int main() 
{ 
    int number; 
    cout << "Enter a number in the range 1-100: "; 
    cin >> number; 

    while (number > 1 || number < 100) 
    { 
     cout << "ERROR: Enter a value in the range 1-100: "; 
     cin >> number; 

    } 
    return 0; 
} 
+0

나는 좋은 중복 (꽤 stackoverflow.com에 여기에 몇 가지, 그리고 더 넓은 인터넷에서 알아보다가)를 찾기 위해 게으른 해요,하지만 문제의 요점은 그 때 입력 연산자 입력을 숫자로 분석 할 수 없으며 입력을 버퍼에 남겨 둡니다. 아무 것도 제거하지 않습니다. 따라서 매번 반복문에서 동일한 입력을 반복해서 읽습니다. [ignore 함수에 대해] (http://en.cppreference.com/w/cpp/io/basic_istream/ignore) 도움을 받으십시오. –

+0

while 구문의 조건이 어떤 것인지 생각해보십시오. – 1201ProgramAlarm

+0

이전의 컴파일러 나 건물을 pre-C++ 11 모드로 사용하고 있다면, 불법적 인 입력에서'number'가 수정되지 않기 때문에 * 정의되지 않은 동작 *이 생깁니다. 그리고 초기화되지 않기 때문에 * 불확정 * 값을 가지게되고 루프의 비교가 UB를 줄 것입니다. –

답변

1

, 그것은 편지는 "INT 번호"에 대한 유효한 입력 아니라는 것을 알고있다. std :: cin에서 오류 플래그를 발생시키고 모든 후속 작업이 실패하고 즉시 반환됩니다.

진행하기 전에 오류 상태를 확인하고 오류 플래그를 지워야합니다.

게시 Why do I get an infinite loop if I enter a letter rather than a number?

+0

감사! @ 탕기 파뜨 레 –

0

고마워 너희들을 기존 참조하십시오. 나는 이것으로 끝났다.

while (!(cin >> number)) 
{ 
    cout << "ERROR: Enter a value in the range 1-100: "; 

    //to clear input stream 
    cin.clear(); 

    //to discard previous input 
    cin.ignore(1200, '\n'); 

    cin >> number; 
}