【问题标题】:cin.fail not working when numbers and letters entered输入数字和字母时 cin.fail 不起作用
【发布时间】:2020-01-28 20:45:51
【问题描述】:

我正在做一个简单的数据验证,作为向数组输入数字的一部分。现在它大部分都在工作,除了一种情况 - 当我输入一个数字后跟一个字母时,我创建它的错误消息抛出,但数字仍然输入到数组中。更让我困惑的是,当我在 Xcode 中编译程序时它按预期运行,但我描述的问题仅在我使用 g++ 编译程序时出现。任何想法将不胜感激。这是我认为给我带来问题的函数。

float getInput()
{
    float input;
    std::cin >> input;
    if (std::cin.fail())
    {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        std::cout << "type char/str not allowed, enter int" << '\n';
        return getInput();
    }
    else
        return input;
}

【问题讨论】:

  • 只是为了澄清,如果输入123abc,输入被分配123,但仍然会抛出错误。对吗?
  • 这并没有解决问题,但不要让这个函数自己调用。递归函数可能非常强大,但它们很少是正确的解决方案。只需编写一个循环:while (!std::cin) { /* clean up */ std::cin &gt;&gt; input; }。或者,更常见的是在测试前去掉std::cin &gt;&gt; input;,放到循环条件中:while (!(std::cin &gt;&gt; input)) { /* clean up */ };
  • @SacrificerXY - 正确,我希望它抛出错误而不接受输入。
  • @PeteBecker - 是的,递归很好,我主要是想聪明一点,练习在这个上使用递归。

标签: c++ xcode c++11 g++ std


【解决方案1】:

解决了。基本上,现在不是使用递归的时候。我将 if 语句放在 while 循环中,在循环末尾添加了第二个 cin,并将 return 移出循环。那照顾了它。感谢您建议改用循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    相关资源
    最近更新 更多