2013-05-20 3 views
1
int option; 
int invalidOption2 = 0; 

while(invalidOption2 == 0){ 
     try{ 
     cin>>option; 
     if(!cin){ 
      error("invalid input"); 
     } 
     if(option<1 || option>2){ 
      error("invalid input"); 
     } 
     if(option==1) { 
      invalidOption2 = 1; 
      cout<<"option 1 was selected"<<endl; 
     } 
     else if(option==2) { 
      invalidOption2 = 1; 
         cout<<"option 2 was selected"<<endl; 
     }  
     } 
     catch(runtime_error& e) { 
       cerr <<"Please enter a valid option" << endl; 
     } 
} 

위의 코드를 사용할 때 입력 한 첫 번째 값은 다음 줄로 이동하고 옵션 메시지 또는 오류를 표시하는 대신 다른 입력을 기다립니다 메시지. 그러나 두 번째 값을 입력하면 정상적으로 작동합니다. 예를 들어while 루프 - 첫 번째 입력 후 아무 것도 발생하지 않습니다.

은 내가 (아무것도 여기에 일어나지 않는다, 그래서 다른 값을 입력해야)

1

가 표시 될 것입니다 "당신은 옵션 1을 선택"

를 입력 한 경우 잘못된 원래 입력에 대한 오류 메시지는 표시되지 않습니다.

대신 아래 결과를 얻는 방법을 알고 싶습니다.

1

"올바른 옵션을 선택하세요"어떤 도움이

+0

'옵션'은 어떤 유형입니까? – Bathsheba

+0

미안하지만, 질문에 편집 해 드리겠습니다. 옵션이 int 타입입니다 – user2383238

답변

1

예외가 발생하지 않는 한 당신은 "Please enter a valid option"을받지 않습니다. error을 표시하지 않지만 이 예외를 throw하지 않으면 catch 블록에 도달하지 않습니다.

또한, cin >> option 거의 확실 나중에 문제가 발생할 수 버퍼의 새로운 라인을, 잎, 그리고 당신이 알파를 입력 whien, option 경우 int, cin이 될 필요가 오류 상태를 입력합니다 입력 (그리고 errousous 입력 제거). 오류 케이스 (!cin)에서 cin.clear()으로 전화해야하며 모든 경우에 cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n' )으로 전화해야합니다.

이러한 문제의 대부분을 피할 대안 솔루션은, (std::getline(std::cin, line) 사용) 를 완전한 라인을 읽고 행을 구문 분석 std::istringstream를 사용하는 입니다.이것은 std::cin을 좋은 상태로두고 다음 행을 입력 할 준비가됩니다.

option = getchar(); 
+0

죄송합니다. 예외가 발생하지 않는 한 메시지가 표시되지 않는다는 사실을 이해하지 못합니다. 내가 a를 입력 한 다음 다른 a를 입력하면 두 번째 오류는 catch하지만 첫 번째 오류는 catch하지 않습니다. – user2383238

+0

'error'를 보지 않고 말하기는 불가능하지만'catch '블록에''유효한 옵션을 입력하십시오.' '는 예외가 없다면 실행되지 않습니다. –

+0

그래서 입력이 유효하지 않은 경우 예외를 throw해야합니까? 나는 진짜로 던지기를 결코 전에 사용하지 않았다 그래서 나는 무엇을하기 위하여 진짜로 모른다? 대신 두 번째 아이디어를 사용하는 것이 나을 것입니다. – user2383238

0

옵션을 감상 할 수있다

정수의 가능성이 높다 "당신은 옵션 1을 선택했다" 따라서 cin은 'a'를 읽을 수 없으므로 무시됩니다.

이 경우가 맞습니까?

당신은 다음과 같이 수정할 수 :

char option; 
while(invalidOption2 == 0){ 
    try{ 
     cin>>option; 
     if(!cin){ 
      error("invalid input"); 
     } 
     if(option<'1' || option>'2'){ 
      error("invalid input"); 
     } 
     if(option=='1') { 
      invalidOption2 = 1; 
      cout<<"option 1 was selected"<<endl; 
     } 
     else if(option=='2') { 
      invalidOption2 = 1; 
      cout<<"option 2 was selected"<<endl; 
     }  
    } 
    catch(runtime_error& e) { 
     cerr <<"Please enter a valid option" << endl; 
    } 
} 

이 당신이 그것을에 기대하는 방법을 작동합니다.

그러나이 같은 건설 :

char option; 
while (cin >> option) { 
    if ((option == '1') || (option == '2')) { 
     break; 
    } 
    else { 
     cout << "Please enter 1 or 2." << endl; 
    } 
} 
cout << "option " << option " << " was selected" << endl; 

아마 더 좋아^_^

+1

왜 안 되나요? (std :: cin 옵션 && 옵션! = '1'&& optionn! = '2') std :: cout << "1 또는 2를 입력하십시오 :"<< std :: endl;'. 왜 코드를 루프의 여러 종료와 혼동하고 끝 부분의 조건을 테스트합니다. –

+0

도움 주셔서 감사합니다,하지만 int 대신 문자로 옵션을 선언했는데 여전히 동일한 문제가 발생합니다. 아직 최신 코드를 테스트하지는 않았지만 옵션 문자열을 입력하면 어떻게됩니까?이 문제를 처리 할 수 ​​있습니까? – user2383238

+0

이유가 보이지 않습니다. 왜 유형을 문자열로 변경하고 if에서 againts 문자열을 비교하면 작동해야합니다. 여러 줄로 된 문자열은 문제가 될 수 있지만 그 경우는 아닙니다. 맞습니까? – Paladin

0

난이 (적어도 눈을위한) 더 나은 코드를 보이는 생각 나는 cin을 두 번 전화하는 것이 여기서 문제가 될 수 있다고 생각합니다. 그러나 확실하지 않습니다. 이 같은 것도 잘 작동해야합니다.

char option[80]; // 80 is the standard terminal line length 
bool loop = 1; 
while(loop) 
{ 
    cin >> option; 
    if (option[1]=='\n') // testing if string is length 1 
    { 
     cout << "Please select a valid input\n"; 
     continue; // if not, display error and try again 
    }; 
    switch(option[0]) 
    { 
     case '1': loop=0; break; // add whatever before break 
     case '2': loop=0; break; 
     default: cout << "please select a valid input\n"; break; 
    }; 
}; 
cout << "Option "<< option << "was selected\n"; 

나는 이것을 컴파일하지 않았지만 괜찮습니다.

0

: 당신은 아직도 당신이 cinintchar으로 다음를보다 효율적으로 사용하는 문제가있다 생각한다면

int option; 
int invalidOption2 = 0; 

while(invalidOption2 == 0) 
{ 
     try 
     { 
     cin>>option; 
     switch(option) 
     {  

     case 1 : 
      invalidOption2 = 1; 
      cout<<"option 1 was selected"<<endl; 
      break;  
     case 2 : 
      invalidOption2 = 1; 
      cout<<"option 2 was selected"<<endl; 
      break; 
     default : 
      error("invalid input");  

     } 
     catch(runtime_error& e) 
     { 
       cerr <<"Please enter a valid option" << endl; 
     } 
} 

:

+0

감사합니다. 잠시 후에 살펴보고 작동하는지 확인하겠습니다. – user2383238

관련 문제