陷入函数循环(C ++)

时间:2015-12-04 17:40:56

标签: c++ function validation switch-statement

我已经编写了一个包含多个菜单的程序。我现在正在调试程序,我想在菜单选项中包含一些输入验证。但是,出于某种原因,当它检测到错误的输入时,它会使用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;

        }


        }

2 个答案:

答案 0 :(得分:1)

('1','2','3','4','5','6','7','8','9','10')的值为'10',因此它是触发第一个案例陈述的唯一值。写这个的正确方法是:

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

尽管有这种变化,但'10'是一种特殊的角色,而且几乎肯定不是正确的。

答案 1 :(得分:0)

您的代码归结为

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')