繁体   English   中英

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

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

我正在尝试仅验证用户输入的整数。 我的代码工作正常,除非用户输入0。它不认为它是整数,并且认为值是false。 这是我如何编码此项目的简短示例。

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为0时, 表达式 !numtrue 。因此,您的实现存在错误。

最简单的方法是使用类似

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

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

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

在c ++中,内置的int类型没有像其他某些语言中那样具有任何可选的有效性:“ !num ”仅表示“ num==0 ”而不是“ num不存在”。

但是C ++ 17具有std::optional模板,可以将您的vanilla 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 numstd::optional<int> num和voila替换int num num-您的代码将按预期工作。

认真地说,只是使用Bathsheba的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM