【问题标题】:std::cin don't break program when reading incorrect int [duplicate]读取不正确的 int 时,std::cin 不会中断程序 [重复]
【发布时间】:2022-02-06 07:08:32
【问题描述】:

我有一个程序可以检查您的年龄和性别。我正在使用 Visual Studio 2022 来查看调试时会发生什么。

如果我为年龄添加随机字母,它会跳过 cin > gender 部分,这很奇怪,当地人显示年龄设置为 0 但性别为 -52'' 。我能做些什么,即使你把奇怪的东西放在年龄上,它仍然至少会影响你的性别?

#include <iostream>
using namespace std;
int main()
{
    // prompt user for age AND gender
    //age is int, gender is character
    int age;
    char gender;
    cout << "What is your age? \n" << endl;
    cin >> age;
    cout << "What is your gender? \n" << endl;
    cin >> gender;

    if (gender == 'f' || gender == 'F')
    {
        bool result = (age > 60);
        switch (result)
        {
        case 0:
            cout << "You do not qualify for discount need to be over 60";
            break;
        case 1:
            cout << "You qualify for discount";
            break;
        }
    }
    else if (gender == 'm' || gender == 'M')
    {
        cout << "You do not qualify you need to be female and over 60 \n" << endl;
    }
    else {
        cout << "Wrong gender either use male or female Exiting... \n" << endl;
        return -1;
        exit;
    }

    return 0;
}

这是视觉工作室当地人区域的图片

【问题讨论】:

    标签: c++


    【解决方案1】:

    在这种情况下需要一些错误处理。

    可以做的事情是读取文本输入,然后尝试将其转换为数字:

    try 
    {
        std::string str;
        std::getline(std::cin, str)
        age = std::stoi(str)
    }
    catch(...)
    {
        // ...
    }
    

    然后你可以通过捕获异常来处理错误。

    https://en.cppreference.com/w/cpp/string/basic_string/stol

    【讨论】:

      【解决方案2】:

      当您为年龄键入错误数据并且转换失败时,cin 进入错误状态。当它处于错误状态时,它拒绝读取任何内容。最简单的解决方法是在第一次之后清除流

      cout << "What is your age? \n" << endl;
      cin >> age;
      cin.clear();  // But now, the bad integer will become the gender
      cout << "What is your gender? \n" << endl;
      cin >> gender;
      

      最好在第一次读取后检查 cin,并进行一些错误处理,可能会打印一条消息并将年龄设置为某个已知值。

      cin >> age;
      if(!cin.good()) {
          // Handle bad input here
      }
      

      注意:整数读取失败后,非整数数据仍在输入流中。如果你只是清楚,那将是下一个阅读内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-27
        • 2016-12-03
        • 2018-11-06
        • 2012-03-23
        相关资源
        最近更新 更多