卡在函数(C++)中的循环中

Stuck in loop within a function (C++)

本文关键字:循环 C++ 函数      更新时间:2023-10-16

我写了一个程序,里面有几个菜单。我现在正在调试这个程序,我想在菜单选项中包括一些输入验证。然而,由于某种原因,当它检测到错误的输入时,它会返回到函数的开头,并使用goto语句(我知道,错误做法:\),它会要求用户输入新的输入,但即使输入是正确的,它也会返回到不允许输入的情况(默认情况)。有人知道发生了什么事吗?

注:

select_variable_check(vector<int> , int)是一个函数,它检查输入的值以前是否输入过,是否有任何相关性,尽管我认为这与它无关。

    void select(vector<int>&select_control) {
        char select;
    choices:
        cin >> select;
        int selectint = select;
        bool check = select_variable_check(select_control, selectint);
        switch (select) {
        case ('1','2','3','4','5','6','7','8','9','10'):

            if (check == false) {
                string city = city_selection(selectint);
                double xcoor = xcoor_selection(selectint);
                double ycoor = ycoor_selection(selectint);
                cout << "n" << city << "n";
                select_control.push_back(selectint);
                cout << "n Enter next city:  ";
                cin >> select;
                selectint = select;

            }
            else {
                cout << "You have already selected that city, please select another one ";
                cin >> select;
            }
            break;

        case '99': {
            cout << "TERMINATING" << endl;
            Sleep(3000);
            exit(0);
            break;
        }
        case '100': {
            cout << "input complete" << endl;
            break;
        }
        default: {
            cout << "not a valid value, please try again" << endl;
            goto choices;
            break;
        }

        }

('1','2','3','4','5','6','7','8','9','10')的值是'10',所以这是唯一会触发第一个case语句的值。写这篇文章的正确方法是:

case '1':
case '2':
case '3':
...

然而,即使有了这种变化,'10'也是一种特殊的性格,在这里几乎肯定不是正确的。

您的代码可以归结为

start:
    get_input
    process_input
    if good do something
    else go to start
end:

现在,当您输入错误的输入时,它将返回到启动状态。您的输入操作将再次失败,因为输入流仍处于错误状态,因此您不会获得新的输入,并且由于您有错误的输入,您将返回开始。要停止此循环,您需要清除流上的错误标志,并删除缓冲区中的任何输入。这将使您的默认情况看起来像

default: {
    cout << "not a valid value, please try again" << endl;
    cin.clear();  // removes error flags
    cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');  // flushes input buffer
    goto choices;
    break;
}

您需要#include <limits>才能使用cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n')