【问题标题】:c++ check if integer variablec++ 检查是否为整数变量
【发布时间】:2014-01-25 10:04:07
【问题描述】:

用户输入日期,当前经过验证以确保该值介于 1 和 31 之间。

但是,如果他们输入一个非整数值,它只会在无限循环中不断重复错误消息。

我四处寻找答案,但其他提出问题的人似乎都比我更擅长 c++,因此我什至不了解他们的初始代码。

这是代码

void Menu::setDate()
{
    date = 0;

    std::cout << "Please enter todays date: (as an integer) ";
    do
    {
        std::cin >> date;   
        if (date > 0 && date < 32)
        {
            break;
        }
        std::cout << "Error: Please enter todays date: (as an integer) ";
    }
    while (true);
 }

【问题讨论】:

  • @juanchopanza 但它应该获取输入,检查它,然后在其有效时中断,或者重新获取输入。但它循环。我认为它类似于,即使您不按 Enter,它也会获得输入。

标签: c++ validation loops integer


【解决方案1】:

首先检查cin.fail()。 这就是你获得无限循环的方式:当std::cin &gt;&gt; date 失败时,date 很可能保持不变。所以你实际上有这个:

do
{
    if (date > 0 && date < 32)
    {
        break;
    }
    std::cout << "Error: Please enter todays date: (as an integer) ";
}
while (true);

【讨论】:

    【解决方案2】:

    问题是当输入非数字时,流会出现错误状态。您应该清除它并跳过无效输入。例如

    cin.clear();
    cin.ignore( std::numeric_limits<streamsize>::max(), '\n' );
    

    【讨论】:

      【解决方案3】:

      您的代码的问题是当输入无效整数时,流会出错并设置为失败位。因此,您需要先清除它,然后才能再次使用 I/O 操作。试试这个:

      void Menu::setDate()
      {
          date = 0;
      
          std::cout << "Please enter todays date: (as an integer) ";
      
          while(true){
              std::cin >> date;
              if(date > 0 && date < 32){
                  break;
              }
              else{
                  std::cout << "Error, please enter today's date (as an integer):" << std::endl;
                  std::cin.clear();
                  std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
              }
          }
       }
      

      【讨论】:

      • 这已停止循环并不断输出错误消息,但是现在它在输入任何内容时输出错误消息,甚至是整数
      • @user3001499 已修复,现在可以试试吗?
      • @user3001499 请注意,这将完美运行,但如果用户输入像“anyintegerandletter”这样的值(例如:12f),它将采用 12 作为整数并忽略f,因此它是一个有效的输入。
      • 好的,感谢您的提示,您可以快速概述 cin.clear() 和 cin.ignore(...) 的作用。这样我就学会了反对只是复制?
      • cin.clear(); 清除流上的错误(failbit),以便将来的 I/O 操作正常工作,cin.ignore(); 忽略流中的所有字符,直到找到新行,基本上忽略所有内容else 在同一行以防止再次出错。
      【解决方案4】:

      看起来当std::cin&gt;&gt;a 遇到小数点时,它会停止进一步输入。剩下的数字留在输入缓冲区中。

      int a,b,c;
      
      std::cin>>a;
      std::cin>>b;
      std::cin>>c;
      

      如果用户输入1.9,在第一步a变成1并且.9留在输入缓冲区。下一个std::cin 语句跳过输入,因为输入缓冲区中的第一个字符是小数点。接受浮点输入时,缓冲区会被清除。

      【讨论】:

        猜你喜欢
        • 2013-10-14
        • 2011-01-12
        • 1970-01-01
        • 1970-01-01
        • 2015-02-25
        • 2011-03-30
        • 1970-01-01
        • 2012-03-25
        • 2011-04-08
        相关资源
        最近更新 更多