2013-11-15 5 views
1

Я пытаюсь сделать простое меню с помощью переключателя. Я также хочу выполнить проверку, если пользователь сделал действительный ввод (только int от 1 до 4). Ввод -4 или 44 работает с этой проверкой. Но если я вхожу что-то вроде «w», это дает мне бесконечный цикл. Я предполагаю, что мне нужно другое, если/else с if (! Cin) blabla else, идите вперед с помощью переключателя. Но я не уверен, как я делаю то, что другой запускает переключатель.C++, получение бесконечного цикла

int menu() { 
     int enter; 
     bool exit = false; 
     do { 
      cout << "Wie soll angefangen werden: " << endl; //Enter your choice 
      cout << "1 - Spiel starten" << endl; // do game(); 
      cout << "2 - Highscore " << endl; //do score(); 
      cout << "3 - Quiz starten " << endl; //do quiz(); 
      cout << "4 - Ende " << endl; //end the programm 

     cin >> enter; 

     switch (enter) { 
      case 1: 
       game(); 
       break; 
      case 2: 
       score(); 
       break; 
      case 3: 
       showQuizDialog(); 
       break; 
      case 4: 
       exit = true; 
       break; 
      default: 
       cout << "Keine gültige Eingabe, nochmal: " << endl; //invalid input, again 
       void flushCin(); 
     } //end of switch 
    } while (exit == false); 

}//end of menu(); 
+0

Что такое 'flushCin'? Вам не нужно будет очищать поток, как вы уже читали. – Mgetz

+0

Попробуйте изменить 'int enter' на' char enter' и 'case 1:' to 'case '1':' – Shubham

+0

Две точки стиля. Во-первых: нет смысла сравнивать «bool» с константой; конечное условие должно быть просто 'while (! exit)'. Во-вторых, вы действительно должны добавить «break;» в случае по умолчанию. –

ответ

11

Это потому, что вход пытается получить целое число. Когда вход не является целым числом, вход остается в буфере, поэтому в следующий раз в цикле остается тот же вход.

Кроме того, вы не вызоваflushCin функции в случае, если по умолчанию, вы объявляя его. Возможно, вы захотите удалить ключевое слово void. Думаю, это правильно? (Т.е. вызов std::cin.ignore() и std::cin::clear().)

+0

Это исправлено для меня, спасибо! – AnnoyedGuy

1

Читайте в строку и попытаться преобразовать в целом:

#include <sstream> 
#include <string> 
using namespace std; 

int menu() { 
     int enter; 
     string str; 


     bool exit = false; 
     do { 
      cout << "Wie soll angefangen werden: " << endl; //Enter your choice 
      cout << "1 - Spiel starten" << endl; // do game(); 
      cout << "2 - Highscore " << endl; //do score(); 
      cout << "3 - Quiz starten " << endl; //do quiz(); 
      cout << "4 - Ende " << endl; //end the programm 

     cin >> str; 
     istringstream buffer(str); 
     buffer >> enter; 

     switch (enter) { 
      case 1: 
       game(); 
       break; 
      case 2: 
       score(); 
       break; 
      case 3: 
       showQuizDialog(); 
       break; 
      case 4: 
       exit = true; 
       break; 
      default: 
       cout << "Keine gültige Eingabe, nochmal: " << endl; //invalid input, again 
       void flushCin(); 
     } //end of switch 
    } while (exit == false); 

    return enter; 

}//end of menu(); 

При ввод других вещей, чем числа в целочисленное значение непосредственно это может не поместиться в зарезервированное пространство int и может привести к смешному поведению. Поэтому просто сначала прочитайте строку, а затем интерпретируйте ее.

+0

вам не нужен 'stringstream', [' std :: stoi'] (http://en.cppreference.com/w/cpp/string/basic_string/stol) отлично справится с этой задачей. – Mgetz

+0

@Mgetz right, существует тысячи способов сделать то же самое в C++ ;-) – Beachwalker

+0

Или прочитать в 'char' и не делать никакого преобразования – Shubham

Смежные вопросы