我创建了一个菜单,用户必须在1-5之间输入一个数字,任何时候用户输入一个完美的数字值,它将转到指定的情况或者如果数字无效,它将转到默认值并显示错误消息。
现在我的问题是,当用户输入一个字母,该程序保持循环和循环,它不会停止,每次都会通过默认值。
我尝试过很多东西!使用if语句检查数字是否为1< = value< = 5,不起作用。如果输入不在这些值之间,我尝试在数字中进行硬编码,它仍然永远循环。我试过做cim.good(),不确定我做得对,但我做的方式并不奏效。我也试过使用isdigit()函数,但同样的问题,它不起作用......我真的不知道自己要做什么。这是我的(简化)。
int menu()
{
int key;
cout << endl << "--------- Main Menu ----------" << endl;
cout << "1: Sort" << endl << "2: Add" << endl;
cout << "3: Search" << endl << "4: History" << endl << "5: Exit" << endl;
cout << "Please pick one: ";
cin >> key;
return(key);
}`
void main()
{
Menu:
key = menu();
switch(key)
{
case 1:
goto Menu;
case 2:
goto Menu;
case 3:
goto Menu;
case 4:
goto Menu;
case 5:
break;
default:
cout << endl << "Invalid entry, please try again" << endl;
goto Menu;
}
}
我删除了案例中的内容,使其看起来更漂亮。当我输入密钥时,我会一直收到&#34;无效条目,请再试一次&#34;消息,以便它经历的地方。
编辑:我为'goto&#39;道歉,没有知道它已经皱眉,还在学习!感谢大家的帮助。我肯定会开始删除它们。答案 0 :(得分:1)
而不是使用goto
,我建议您使用简单的do {} while
循环,如
#include <iostream>
using namespace std;
int menu() {
int key;
cout << endl << "--------- Main Menu ----------" << endl;
cout << "1: Sort" << endl << "2: Add" << endl;
cout << "3: Search" << endl << "4: History" << endl << "5: Exit" << endl;
cout << "Please pick one: ";
cin >> key;
return(key);
}
int main(int argc, char *argv[]) {
int key;
do {
key = menu();
} while (key < 1 || key > 5);
cout << key << endl;
}
当 key < 1
或key > 5
时,会循环。
答案 1 :(得分:1)
从C ++ FAQ lite和this posting中查看this posting。
使用cin.good()
进行检查是解决方案的第一部分。如果输入非整数,则cin.good()
将返回false。但是,错误的输入将保留在缓冲区中。因此,如果再次遇到cin >> key
,它将再次无法读取任何内容。
您必须使用cin.clear()
清除状态,然后使用cin.ignore(INT_MAX, '\n')
忽略缓冲区的其余部分(直到行尾)
所以你的方法会变成:
int menu() {
int key;
cout << endl << "--------- Main Menu ----------" << endl;
cout << "1: Sort" << endl << "2: Add" << endl;
cout << "3: Search" << endl << "4: History" << endl << "5: Exit" << endl;
cout << "Please pick one: ";
while(cin >> key) { // same as querying cin.good()
cout << "Not a number" << endl;
cin.clear();
cin.ignore(INT_MAX, '\n');
}
return(key);
}