我尝试使用开关做一个简单的菜单。我还想检查用户是否输入了有效的输入(只有int从1到4)。输入-4或44可以正常使用此检查。但如果我输入类似“w”的东西,它会给我一个无限循环。 我猜我需要另一个if / else if if(!cin)blabla else继续开关。 但我不知道我是怎么做的,其他人正在开始转换。
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 :(得分:11)
这是因为输入正在尝试获取整数。当输入不是整数时,输入保留在缓冲区中,因此下一次循环中仍然存在相同的输入。
此外,在默认情况下,您不是调用 flushCin
函数,而是声明它。您可能希望删除void
关键字。我想这是正确的吗? (即,呼叫std::cin.ignore()
和std::cin::clear()
。)
答案 1 :(得分:1)
读入字符串并尝试转换为int:
#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的保留空间,并且可能导致有趣的行为。所以先读入一个字符串然后解释它。