【问题标题】:Input Validation w/ numbers&strings带/数字字符串的输入验证
【发布时间】:2016-11-15 14:29:38
【问题描述】:

所以我刚刚学习了输入验证,但是我遇到了一个问题。我强迫用户输入一个数字而不是一个有效的字符串,但是如果用户输入一个数字(一个包含在开关盒中的数字)和一个字符串,那么程序就会崩溃。有关更改哪些内容以便验证适用于所有内容的任何提示?

    int menu(double pi)                                                             //menu for choosing a shape
{
    int choice = 0;
    cout << "Please select what you wish to calculate:\n\n1 - Area of a Circle\n\n2 - Circumference of a Circle\n\n3 - Area of a Rectangle\n\n4 - Area of a Triangle\n\n5 - Volume of a Cuboid\n\n ";
    while (!(cin >> choice))
    {
        cout << "Invalid input, please enter a number of 1-5\n\n";
        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.\n\n";
            break;
        }
     return 0;
}

【问题讨论】:

  • 通常,如果您想要防弹代码,您需要将输入作为字符串读取,然后解析并将其转换为您想要的。
  • 呃,我有点明白你的意思,虽然不是很明白,如果不是问题,你介意提供一些示例代码吗?我还是个编程菜鸟,从 9 月开始

标签: c++ string validation input


【解决方案1】:

使用问题

cin >> choice

当输入一个数字时,&gt;&gt; 将在第一个非数字输入处停止,只要有数字输入开始,它就会将其视为有效读取。这意味着就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 时才停止循环。

【讨论】:

  • 我明白你在说什么,但我尝试在我的程序中实现这一点,但 getline 和 stoi 身份不明。我应该使用任何其他库吗? (仅使用
  • @PinkieBarto 你需要&lt;string&gt; 给他们
猜你喜欢
  • 1970-01-01
  • 2011-12-17
  • 2016-06-12
  • 2012-05-10
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 2016-04-26
  • 2011-07-24
相关资源
最近更新 更多