2011-09-14 2 views
8

다음 루프가 있습니다. 그것은 EndOfFile까지 숫자를 읽거나 사용자의 입력이 잘못된 것 같은 일부 char의,이 루프 clear 오류 상태를 보내고 또는 중지하지 않고 영원히 반복되는 사용자 입력 -999cin.clear()가 cin 객체를 재설정하지 않습니다.

int arr[100]; 

int index; 

for (index = 0; index < 100; index++) 
{ 
cin >> arr[index]; 
if (!cin) 
{ 
    cin.clear(); 
    index--; 
    continue; 
} 
if (arr[index] == -999) 
{ 
    break; 
} 
} 

한다.

답변

8

clear을 호출 한 후 잘못된 입력을 스트림에서 제거해야합니다. 여기에 한 가지 방법입니다 :

cin이 잘못된 입력을 읽어 실패 할 때, 그것은 스트림에 남아 때문입니다
cin >> arr[index]; 
if (!cin) 
{ 
    cin.clear(); 
    std::string ignoreLine; //read the invalid input into it 
    std::getline(cin, ignoreLine); //read the line till next space 
    index--; 
    continue; 
} 

. 어떤 방법으로 제거해야합니다. 나는 그것을 읽고 무시한다.

당신은 또한 사용할 수 있습니다 ignore로 : 내 의견 제공 입력이 분리 공간있다 (당신이 하지 않으려면 잘못된 입력을 검사)에 더

cin.clear(); 
cin.ignore(std::numeric_limits<streamsize>::max(),' '); 

. online doc 말한다 :

은 IStream을 무시 ::

& IStream을 무시 (streamsize N = 1 = INT DELIM EOF);

추출 및 폐기 문자

추출물 입력 시퀀스에서 문자를 삭제합니다.

n 문자가 추출되고 이 (가) 삭제되거나 문자 delim이 발견 될 때 추출이 종료됩니다 (둘 중 빠른 날짜 적용). 후자의 경우, delim 문자 자체도 추출됩니다.

+1

따라서 무한 루프 !! –

+0

@ Mr.DDD : 정확합니다. :-) – Nawaz

+0

@ Mr.DDD : 귀하가 제공 한 잘못된 입력은 무엇입니까? – Nawaz