我如何接受0作为整数而不是bool值?

时间:2017-04-11 07:43:45

标签: c++

我正在尝试仅为整数验证用户输入。我的代码工作正常,除非用户输入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循环。

2 个答案:

答案 0 :(得分:2)

表达式 !numtrue当且仅当num为0.所以你的实现是错误的。

最简单的方法是使用

之类的东西
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>)。

答案 1 :(得分:0)

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

但是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并瞧 - 您的代码可以正常运行。

但说真的,只需使用Bathsheba的解决方案。