带数字和字符串的输入验证

Input Validation w/ numbers&strings

本文关键字:输入 验证 字符串 数字      更新时间:2023-10-16

所以我刚刚学会了输入验证,但是我遇到了一个问题。我强迫用户输入一个数字而不是一个有效的字符串,但是如果用户输入一个数字(一个包含在switch case中)和一个字符串,那么程序就会崩溃。有什么建议要改变,使验证工作在一切?

    int menu(double pi)                                                             //menu for choosing a shape
{
    int choice = 0;
    cout << "Please select what you wish to calculate:nn1 - Area of a Circlenn2 - Circumference of a Circlenn3 - Area of a Rectanglenn4 - Area of a Trianglenn5 - Volume of a Cuboidnn ";
    while (!(cin >> choice))
    {
        cout << "Invalid input, please enter a number of 1-5nn";
        cin.clear();
        cin.ignore(100, 'n');
    }
    system("CLS");
     switch (choice)                                                                //switch case for each shape
        {
        case 1:
            circleArea(pi);
            break;
        case 2:
            circleCircum(pi);
            break;
        case 3:
            rectanArea();
            break;
        case 4:
            triangArea();
            break;
        case 5:
            cubVol();
            break;
        default:
            cout << "Invalid input! Please try again.nn";
            break;
        }
     return 0;
}

使用

的问题
cin >> choice

当输入一个数字时,>>将在第一个非数字输入处停止,只要有数字输入开始,它就会将其视为有效读取。这意味着,就cin而言,2L2.0-1T都是有效的整数输入。它只是将无效的部分留在流中。正是这些剩余的蒸汽输入使程序在下一个输入操作中出错。

解决这个问题的一种方法是使用getline将输入读入std::string,然后解析字符串以确保它包含有效的输入。如果你想获得一个int,例如
int choice;
std::string input;
std::size_t pos;
do
{
    std::cout << "Enter Choice: ";
    std::getline(cin,input);
    choice = stoi(input, &pos);
} while(pos != input.size());

这可以确保您读取所有内容,直到按下回车键进入input,并且只有在输入的所有内容可以转换为有效的int时才停止循环。