2013-07-27 3 views
0

나는 사용자가 다른 값을 입력 할 필요없이 텍스트를 반복해서 유지하는 while 문을 사용합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 여전히 입력을 요구하지 않습니다. 텍스트를 한 번 표시 한 다음 입력을 요청하는 코드가 필요합니다. 아마도 1을 입력 했더라면 1을 반복 할 것입니다. 단순히 그것을 의미 조치를 정정 할 수있는 기회없이 루프의 당신을 맞이할하지만 (마지막 편집로, 아래를 참조하십시오.)While 문이 중지되지 않습니다.

int action = 0; 
while (action != 1) 
{ 
    cout << " No you must look it might be dangerous" << endl; 
    cin >> action; 
} 

한 가지 제안을했다 :

while (action != 1) 
{ 
    cout << " No you must look it might be dangerous" << endl; 
    cin >> action; 
    cin.ignore(); 
} 

그 여전히 반복해서 텍스트를 생성합니다.

while (action != 1) 
{ 
    cout << " No you must look it might be dangerous" << endl; 
    if (!(cin >> action)) 
     // ...problems in the I/O stream... 
     break; 
} 

새로운 동작을 입력 할 수있는 기회입니다.

+1

'동작'은 어디에 정의되어 있습니까? – user2357112

+0

Typo, 동작 = 0입니다. – user2626532

+0

시도해 보셨습니까? getline (cin, action); – btse

답변

2

공백이 아니며 정수의 일부가 될 수없는 문자를 입력하면 무한 루프가 발생합니다. action에 저장된 값을 변경하지 않고도 action에 대한 각 입력이 잘못된 문자에서 실패합니다.

당신은 쓸 수 :

int action = 0; 
while (action != 1) 
{ 
    cout << " No you must look it might be dangerous" << endl; 
    if (!(cin >> action)) 
     // ...problems in the I/O stream... 
     break; 
} 

이 연속 루프보다 더 우아하게 EOF와 알파벳 문자를 처리합니다. 함수에서 플래그를 설정하거나 오류 조건을 리턴하거나 루프에서 벗어나는 다른 작업을 수행해야 할 수도 있습니다. 성공을 위해 입력을 항상 확인하십시오.

당신은 또한 당신이 루프에서 action에 저장되어지고있는 값을 출력 고려해 볼 수 있습니다, 그래서 당신은 무슨 일이 일어나고 있는지 볼 수 있습니다

int action = 0; 
while (action != 1) 
{ 
    cout << " No you must look it might be dangerous" << endl; 
    if (!(cin >> action)) 
     // ...problems in the I/O stream... 
     break; 
    cerr << "Action: " << action << endl; 
} 

이 너무 당신에게 유용한 무언가를 말할 수 있습니다. SSCCE (Short, Self-Contained, Correct Example) -


가 문제를 설명하는 완벽한 작은 프로그램을 제시해주십시오. - 무슨 일이 일어나고 있는지 단지 나에게 말하고있다 루프 후 재료를 더 이상 최소한의 코드 없습니다

#include <iostream> 
using namespace std; 

int main() 
{ 
    int action = 0; 
    while (action != 1) 
    { 
     cout << " No you must look it might be dangerous" << endl; 
     if (!(cin >> action)) 
     { 
      // ...problems in the I/O stream... 
      break; 
     } 
     cout << "Action: " << action << endl; 
    } 
    cout << "After loop" << endl; 
    if (!cin) 
     cout << "cin is bust" << endl; 
    else 
     cout << "Action: " << action << endl; 
} 

: 예를 들어

, 내가 함께 테스트하고 있습니다. 그러나 그것은 내 코드가 내가 원하는 것을하고 있는지 확인하는데 도움이된다.

동일한 코드가 보이고 프롬프트에 무엇을 입력하고 있습니까? 특히이 코드 조각에 도달하기 전에 무엇을 입력하고 있습니까? (여기에 오기 전에 어떤 입력 활동이 진행되고 있는지)?

+0

나는 그것을했다. 루프에서 빠져 나올 때 대단한 일을했습니다. 여전히 입력을 요구하지 않았습니다. 텍스트를 한 번 표시 한 다음 입력을 요청하는 코드가 필요합니다. 아마도 1을 입력 했더라면 1을 반복 할 것입니다. 그러나 그것은 그대로 행동을 바로 잡을 기회없이 루프에서 빠져 나옵니다. – user2626532

+0

'입력을 요청하지 않았다'는 것은 무엇을 의미합니까? 실행하면 '보이지 않음'프롬프트가 나타나고 데이터를 입력합니다. 그게 무슨 일이 일어나는 것이 아닌가? 입력 스트림이 이미 오류 상태에 있으면 루프에서 빠져 나옵니다. '// ... problems' 주석 대신에 몇몇 복구 액션을 코딩 할 필요가 있습니다 (그리고'if' 문의 본문 주위에 중괄호를 추가하십시오). 여기에는 오류 상태 재설정, 줄 끝까지의 읽기 및 기타 조치가 포함될 수 있습니다. –

+0

나는 cerr 조치를 취했다. 그것은 0을 반환해야합니다. 문제는 내가 그것을 바꿀 것을 요구하지 않는다는 것이다. – user2626532

관련 문제