如何在不退出while while循环的情况下验证输入?

时间:2016-02-25 23:52:32

标签: c++ validation loops input do-while

我正在开发一个程序,通过输入1-3(4到退出)中的整数来提示用户从3个不同的选项中进行选择。我需要编写一个验证输入是整数的代码,如果它不是整数,则重新调用它们。这是我的代码的基本概念(整个发布时间过长)。

do 
{
cout << "Menu: Please select one of the following options:" << endl;
    cout << " 1 - Drop a single chip into one slot." << endl;
    cout << " 2 - Drop multiple chips into one slot." << endl;
    cout << " 3 - Drop 5 chips into each slot." << endl;
    cout << " 4 - Quit the program." << endl;
    cout << "Enter your selection now: ";
    cin >> first_input;
}while (first_input!=4)

然后我有多个if语句根据用户选择的选项执行表达式。我还提示他们稍后在代码中输入其他整数值。

如果用户输入无法输入整数而是输入字符,如何将用户发送回菜单?约束:无法使用continuebreak

提前致谢。

4 个答案:

答案 0 :(得分:1)

如果你想在非整数输入的情况下回到起点,也许这样的东西会起作用吗?

// Insert after "cin >> first_input;"
if (cin.fail()) {
    // Handle non-int value.

    // Clear error flag.
    cin.clear();

    // Empty buffer up to next newline.
    cin.ignore(numeric_limits<streamsize>::max(), '\n');

    // Complain & restart.
    cout << "Invalid input.  Please try again." << endl;
    continue;
}

这样做是清除错误标志,清除缓冲区,然后返回到开始。 cin.ignore()未明确需要传递std::numeric_limits<std::streamsize>::max()作为其第一个参数;但是,如果出现错误,我更愿意这样做,以确保错误的输入消失。请注意,std::numeric_limits是在标准标题<limits>中定义的,需要将其包含在内。

答案 1 :(得分:0)

您正在寻找continue关键字。

答案 2 :(得分:0)

do 
{
    cout << "Menu: Please select one of the following options:" << endl;
    cout << " 1 - Drop a single chip into one slot." << endl;
    cout << " 2 - Drop multiple chips into one slot." << endl;
    cout << " 3 - Drop 5 chips into each slot." << endl;
    cout << " 4 - Quit the program." << endl;
    cout << "Enter your selection now: ";
    cin >> first_input;
    //lets say if user enters value out of range. then want to show menu again.
    if(first_input > 4) {
        cout << "Invalid input "<<endl;
        continue;
    }
    // you can do other stuff here. 
    // ...
}while (first_input!=4)

答案 3 :(得分:0)

您可以尝试使用 转到标签。

do{
   label:
        // your code
if(check) goto label;
}while(check);

do{ label: // your code if(check) goto label; }while(check);