C++ 检查用户输入是否为浮点数

4

我想检查用户输入的是否是有效的浮点数。奇怪的是,对于int类型的数据,这似乎是可行的,但当我将代码更改为读取float类型时,却出现了错误信息。

error: invalid operands of types 'bool' and 'float' to binary 'operator>>'

这是我的代码:

#include <iostream>

int main()
{
    float num;  // Works when num is an 'int', but not when its a 'float'
    std::cout << "Input number:";
    std::cin >> num;
    if (!std::cin >> num){
        std::cout << "It is not float.";
    }
}

3
当你读取用户的输入到一个float时,如果用户并不是想要输入一个float,那么现在已经为时过晚了,字节已经被消耗掉了。我建议将用户的输入读入到一个std::string中,然后您可以检查字符串的内容是否包含数字或字母,并根据此决定如何解析字符串的内容。 - Jeremy Friesner
3
与其扫描字符串,我建议将其传递给 std::stof 并捕获任何异常。利用标准库对浮点数的定义,而不是重复发明轮子。 - Keith Thompson
@KeithThompson 听起来不错,尽管原帖作者可能对什么应该算作“浮点数”有一些具体的想法(例如,“42”是浮点数还是整数?我认为 std::stof() 会将其分类为浮点数,但原帖作者可能希望将其处理为整数)。 - Jeremy Friesner
@JeremyFriesner std::stof() 还接受 "INFINITY", "NAN" 和许多变体。 (我猜原帖的作者可以安全地忽略这一点。)https://en.cppreference.com/w/cpp/string/basic_string/stof - Keith Thompson
1个回答

8

一元运算符 !优先级>> 更高,因此表达式

!std::cin >> num

被解析为

(!std::cin) >> num

这段代码试图调用 operator>>(bool, float),但是没有定义这样的重载,因此出现了错误。

看起来你想要写成:

!(std::cin >> num)

请注意,只有当num是一个int时,您的代码才能“工作”,这要归功于!std::cin(一个bool)被隐式提升int。实际上,您正在调用operator>>(int, int),它将!std::cin的整数值向右移动了num次。毫无疑问,这不是您想要的结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接