2013-10-15 5 views
1

숫자 입력에 대해서만 입력 유효성 검사를 수행하는 데 문제가 있습니다. 아래는 내 코드를 반복 할 때마다 문자를 입력 할 때마다 잘못된 숫자를 입력해도 발생하지 않습니다. '입력이 잘못되었습니다. 다시 시도하십시오.' 유일한 옵션은 그것을 닫는 것입니다. 이 문제를 어떻게 해결할 수 있습니까? 그 루프 당 두 개의 입력을 만들면서사용자가 문자를 입력 할 때 루프에 걸림

 while (!(cin >> userOption) || userOption < 1 || userOption > 12) { 
      cout << "Invalid Input, please try again." << endl; 
      cin >> userOption; 
      std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
      std::cin.clear(); 
+0

가 왜 조건과 루프 본문 모두에'cin >> userOption'이 있습니까? 본체에서 꺼내십시오. – Angew

+0

교환 운영자에게 "default"브랜치를 사용하는 것을 잊었습니다 – darmat

+0

'case 12 '에 도달 할 수없는 코드가 있습니다. – fiscblog

답변

3

당신은 while 상태에서 루프 내부 cin >> userOption 모두를 원하지 않는다.

while 상태에있는 것이 충분해야합니다. 결과가 OK 인 경우

+0

그것은 진실의 절반에 불과합니다. 'userOption'이 초기화되어야합니다. 그래서 user2882555가 조건 안에 넣습니다. – fiscblog

+1

@fiscblog : molbdnilo는 초기화를 수행하는 'cin >> userOption'을 유지하고, 루프 몸체에있는 것을 빼 버린다. – Roddy

0

루프의 탈옥이 시도 : 모든

while (true) { 
     if (!(cin >> userOption) || (userOption_tmp < 1) || (userOption_tmp > 12)) { 
     cout << "Invalid Input, please try again." << endl; 
     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
     std::cin.clear(); 
     } 
     else { 
      break; 
     } 

     //this is looping when letter inputed 
    } 
+0

죄송합니다 (cin >> userOption)는 if 내부에 있어야합니다. 결정된. – Atle

+0

Sry, 내 잘못'cin >> userOption'도 삭제했습니다. – Atle

0

먼저 userOption 초기화 :

unsigned int userOption = 0; 

는 다음과 같이 이동 :

while (userOption < 1 || userOption > 12 /* or even true, like Atle suggested */) 
{ 
    cin >> userOption; 
    if(!cin || userOption < 1 || userOption > 12) 
    { 
     cout << "Invalid Input, please try again." << endl; 
     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
     std::cin.clear(); 
     continue; 
     } 
     else 
     break; //this is looping when letter inputed 
} 
+0

잘못된'cin >> userOption)'을 삭제했기 때문에 초기화 만하면됩니다. – Roddy

+0

@Roddy True. 또 다른 요지는'서명되지 않은 것' – fiscblog

+0

@Angew Thanks, edited. – fiscblog

관련 문제