开关/案例不间断循环

时间:2015-01-13 19:11:43

标签: c++ loops switch-statement case

我创建了一个菜单,用户必须在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;道歉,没有知道它已经皱眉,还在学习!感谢大家的帮助。我肯定会开始删除它们。

2 个答案:

答案 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 < 1key > 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);
}