C++ 如何将0接受为整数而不是布尔值?
我正在尝试只验证用户输入的整数。我的代码工作正常,除非用户输入0。它不认为它是整数,它认为数值是错误的。下面是我如何编写这个项目的一个简短示例C++ 如何将0接受为整数而不是布尔值?,c++,C++,我正在尝试只验证用户输入的整数。我的代码工作正常,除非用户输入0。它不认为它是整数,它认为数值是错误的。下面是我如何编写这个项目的一个简短示例 int main () { int num; cout << "Please enter an integer: "; cin >> num; cout << endl; while (! num) { cout << "That
int main ()
{
int num;
cout << "Please enter an integer: ";
cin >> num;
cout << endl;
while (! num)
{
cout << "That is not an integer.\n";
return;
}
}
int main()
{
int-num;
cout>num;
cout表达式!num
为true
如果且仅当num
为0。因此,您的实现存在缺陷
最简单的方法是使用
if (!(std::cin >> num)){
std::cout << "That is not an integer.\n";
}
if(!(std::cin>>num)){
std::cout表达式!num
为true
如果且仅当num
为0。因此,您的实现存在缺陷
最简单的方法是使用
if (!(std::cin >> num)){
std::cout << "That is not an integer.\n";
}
if(!(std::cin>>num)){
STD::C++中的CUT< P>内置的代码> INT/CUT>类型不具有任何可选的有效性,就像它在其他语言中所做的那样:“<代码>!Num < /代码>”只是“<代码> num=0</代码>”,而不是“<代码> Num < /C> >不存在。
然而,C++17有std::可选的模板,它可以将普通的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;
}
模板
basic_istream&operator>>(basic_istream&st,
std::可选值(可选值和值)
{
T res;
st>>res;
值=(st)?res:{};
返回st;
}
想一想,STL应该提供盒子中的重载
现在,您只需将int num
替换为std::optional num
,瞧,您的代码按预期工作
>认真地,只使用BaseHBA的解决方案。在C++中,内置的<代码> int >代码>类型对它没有任何可选的有效性,就像它在其他语言中所做的那样:“<代码>!Num < /代码>”只是“<代码> Num=0</代码>”,而不是“<代码> Num < /C> >不存在。
然而,C++17有std::可选的模板,它可以将普通的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;
}
模板
basic_istream&operator>>(basic_istream&st,
std::可选值(可选值和值)
{
T res;
st>>res;
值=(st)?res:{};
返回st;
}
想一想,STL应该提供盒子中的重载
现在,您只需将int num
替换为std::optional num
,瞧,您的代码按预期工作
说真的,只要用芭丝谢芭的解决方案。while(!num)
意味着如果num
是0
您的检查逻辑被破坏,则进入循环。num
始终是一个整数。您应该检查cin>>num
的返回值。您只获得整数,您只使用num
进行条件检查,并且它的行为与预期的一样。如果您解释了用例,那么我将t可能更有帮助。num
始终是一个int。如果有人输入字符串,cin>>num;
将抛出。while(!num)
意味着如果num
是0
您的检查逻辑被破坏,则进入循环。num
始终是一个整数。您应该检查cin>>num
的返回值。您只获得整数,您只使用num
进行条件检查,并且它的行为与预期的一样。如果您解释了用例,那么我将t可能更有帮助。num
始终是一个int。如果有人输入字符串,cin>>num;
将抛出。谢谢!我在编写此代码时一定很累,因为我以前肯定用这种方式验证过输入。谢谢!我在编写此代码时一定很累,因为我肯定验证过输入t他过去的方式。谢谢!