如何接受 0 作为整数而不是布尔值

How do I accept 0 as an integer and not a bool value?

本文关键字:布尔值 整数 何接受      更新时间:2023-10-16

我正在尝试仅验证整数的用户输入。我的代码工作正常,除非用户输入 0。它不认为它是一个整数,它认为该值是假的。以下是我如何编写此项目的简短示例。

int main ()
{
    int num;
    cout  << "Please enter an integer: ";
    cin >> num;
    cout << endl;
     while (! num)
     {
          cout << "That is not an integer.n";
          return;
     }
}

如果用户输入 0,即使 0 是整数,我也会被发送到 while 循环中。

表达式 !num 当且仅当 num 为 0 时true。所以你的实现是有缺陷的。

最简单的方法是使用类似的东西

if (!(std::cin >> num)){
    std::cout << "That is not an integer.n";
}

如果您想自己验证输入,请考虑读取std::string并检查是否可以将其转换为整数。令人惊讶的是,这并不平凡,因为int可以采用的可能值非常依赖于平台(某些系统的范围小至 -32767 到 +32767(。

如果可以,请使用我已将num升级到std::string类型的boost::lexical_cast<int>(num);。(您需要的标题是 <boost/lexical_cast.hpp> (。

在 c++ 中,内置的 int 类型不像在其他一些语言中那样具有任何可选的有效性:"!num"只是意味着"num==0"而不是"num不存在"。

但是C++17 std::optional模板,可以将您的香草int变成您最初期望的!

您所需要的只是一些简单的模板魔术来使其与istream一起使用:

template< class CharT, class Traits, class T >
basic_istream<CharT,Traits>& operator>>( basic_istream<CharT,Traits>&& st,  
                                         std::optional<T>& value )
{
    T res;
    st>>res;
    value = (st)?res:{};
    return st;
}

想想看,STL应该提供盒子里的重载。

现在您所需要的只是将int num替换为 std::optional<int> num,瞧 - 您的代码按预期工作。

不过说真的,只需使用拔示巴的解决方案。