输入数字和字母时 cin.fail 不起作用

Posted

技术标签:

【中文标题】输入数字和字母时 cin.fail 不起作用【英文标题】:cin.fail not working when numbers and letters entered 【发布时间】: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 - 是的,递归很好,我主要是想聪明一点,练习在这个上使用递归。 【参考方案1】:

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

【讨论】:

以上是关于输入数字和字母时 cin.fail 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的 cin.fail() 和 !cin 有啥区别?

利用 char 确定输出不起作用

使用 cin::fail() 从标准输入进行无限循环读取

PHP、MySQL 验证故障和搜索不起作用?

C#输出数组的最小数

如何从字符串中提取简单的数字表达式数字?