c++ - 验证整数输入 C++?

标签 c++ validation input types

我使用 !(cin >> input) 来验证整数输入,但它不捕获其他数据类型,例如 float 。相反,它取第一个整数。例如:

Please enter a number: 2.5.

我的错误信息出现在这里,它应该循环但它取而代之的是第一个数字。

输出“2”

如何让它忽略小数输入?

最佳答案

输入流将任何以符号开头且后跟至少一位十进制数字的内容视为有效的整数输入。如果你想在包含小数点的小数输入上失败,你需要做一些不同的事情。处理此问题的一种方法是读取一个整数并查看成功读取整数后的字符是否为小数点:

if (!(std::cin >> value)
    || std::cin.peek() == std::char_traits<char>::to_int_type('.')) {
    deal_with_invalid_input(std::cin);
}

正如 Thomas Matthews 正确指出的那样,问题并不真正限于 float ,而是任何带有数字前缀后跟非空格(而不是 EOF:上述解决方案实际上会在文件的末尾,即后面没有任何内容,甚至没有换行符)。要只读取后跟空格或文件末尾的整数,可以按顺序执行以下操作:

if (!(std:cin >> value)
    || (!std::isspace(std::cin.peek())
        && std::cin.peek() != std::char_traits<char>::eof())) {
    deal_with_invalid_input(std::cin);
}

实际上没有任何方法可以返回已读取的字符。由于在许多地方使用它并不是很好,因此将此功能打包到合适的 std::num_get<char> 中可能是合理的。小平面和imbue()具有相应 std::locale 的流.虽然处理代码的表达式实际上更简单,但它更高级一些。

关于c++ - 验证整数输入 C++?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13370189/

相关文章:

javascript - 日期验证年份失败

选中复选框时 jQuery 切换输入

angularjs - 在 AngularJS 表单中添加复选框

c++ - 如何使用原子指针执行双缓冲?

c++ - 在Google colaboratory中为C++安装OpenCV需要太多时间

java - Spring:@Validated 和@Async 不能一起工作

ruby-on-rails - Rails 4单选按钮表单帮助程序,true尚未验证

input - CSS/HTML - 如何在输入中设置内部填充?

c++ - 在自定义容器上使用范围算法

c++ - 如果我使用 malloc() 而不是堆栈数组,OpenGL 不会渲染对象?