我创建了一个菜单,用户必须在其中输入 1-5 之间的数字,每当用户输入一个数值时,它就会完美地工作,它要么进入指定的大小写,要么在无效数字的情况下,它将转到默认值并出现错误消息。
现在我的问题是当用户输入一个字母时,程序会不断循环,每次通过默认值时,它都不会停止。
我尝试了很多东西!使用 if 语句检查数字是否为 1 <= 值 <= 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;
}
}
我删除了箱子里的内容,让它看起来更好。当我输入密钥时,我不断收到"无效条目,请重试"消息,所以这就是它正在经历的地方。
编辑:好吧,我为"goto"道歉,不知道它皱眉,仍在学习!谢谢大家的帮助。我肯定会开始删除它们。
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
.
看看C++常见问题精简版和这篇文章中的这篇文章。
与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);
}