2015-08-28 3 views
0

здесь кодсоздал случай переключения для аргумента int со случаем по умолчанию. но по умолчанию случай не может обработать правильно, то символы

int miscellaneous::printWelcomeScreen(){ 
    int ch; 
    cout<<"Tic Tac Toe"<<endl<<endl; 
    cout<<"1. Play Game "<<"2. How to Play "<<"3. Credits "<<endl; 
    cout<<endl<<"Enter Your Choice"<<endl; 
    cin>>ch; 
    choiceSelection(ch); 
    return 0; 
} 

int miscellaneous::choiceSelection(int ch){ 
    switch(ch){ 
    case 1: break; 
    case 2: showHelp();break; 
    case 3: showCredits();break; 
    default: { 
      cout<<"Wrong Choice dude!! Use your keyboard Properly next time"; 
      printWelcomeScreen(); 
      break; 
      } 
    } 
    return 0; 
} 

Когда я подам вход INT, по умолчанию случай работает отлично, Но когда я даю ввод обугленной, по умолчанию случае начинает работать в бесконечном петля.

Почему это происходит? Я даже пробовал разобрать ch перед переходом на коммутатор.

+0

Возможно, вам лучше использовать 'char ch' вместо' int ch' и обновить 'switch', чтобы проверить символы' '1'', '' 2'' и' '3''. –

ответ

2

Когда вы вводите значение char, операция cin (input) завершается неудачно, так как вводится нечто иное, чем тип ch. Итак, здесь необходимо проверить погоду, что операция ввода завершилась неудачно или нет. Для этого используйте cin.fail(), который будет установлен на cin fail.

int miscellaneous::printWelcomeScreen() 
{ 
    int ch = 0; 
    cout<<"Tic Tac Toe"<<endl<<endl; 
    cout<<"1. Play Game "<<"2. How to Play "<<"3. Credits "<<endl; 
    cout<<endl<<"Enter Your Choice"<<endl; 
    cin >> ch; 
    if(cin.fail() != 0) 
    { 
     std::cout << "Hey! That's not valid input! Try again.\n\n" 
     cin.clear(); 
     cin.ignore(10000,'\n'); 
    } 
    cout << " ch = " << ch << endl; 
    choiceSelection(ch); 
    return 0; 
} 

Когда cin проверен и найден не найден, тогда необходимо очистить флаг ошибки на cin. Подробности об этом разъясняются по этой ссылке: Why would we call cin.clear() and cin.ignore() after reading input?.

+0

Спасибо, это сработало. Должен ли я вызвать cin.clear() после каждого входа? –

+1

@VikasKumar да, его хорошая практика для проверки операции чтения успешна или нет. Если его не удалось, вам нужно вызвать cin.clear(). –

1

Вы не проверяете, не удалось ли прочитать. И как таковой, если std::cin терпит неудачу один раз, он будет неявно терпеть неудачу до тех пор, пока не будет обработана ситуация, что приведет к бесконечной рекурсии и возможному переполнению стека. Вместо этого используйте что-то подобное.

int miscellaneous::printWelcomeScreen() { 
    int n; 
    bool again; 

    do { 
     again = false; 

     std::cout << "Tic Tac Toe\n\n1. Play Game\n2. How to Play\n3. Credits\n\nEnter your choice: "; 
     std::cin >> n; 
     if(std::cin.fail() || !choiceSelection(n)) { 
      again = true; 
      std::cout << "Hey! That's not valid input! Try again.\n\n" 

      continue; 
     } 
    } while(again); 

    return 0; 
} 

bool miscellaneous::choiceSelection(int n) { 
    switch(n) { 
     case 1: 
      // ... 
      break; 

     case... 

     default: 
      return false; 
    } 

    return true; 
} 
Смежные вопросы