我正在尝试仅为整数验证用户输入。我的代码工作正常,除非用户输入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循环。
答案 0 :(得分:2)
表达式 !num
是true
当且仅当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的解决方案。