开关/机箱不间断循环

Switch/Case nonstop looping

本文关键字:循环 不间断 机箱 开关      更新时间:2023-10-16

我创建了一个菜单,用户必须在其中输入 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 < 1key > 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);
}