如何接受 0 作为整数而不是布尔值
How do I accept 0 as an integer and not a bool value?
我正在尝试仅验证整数的用户输入。我的代码工作正常,除非用户输入 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
,瞧 - 您的代码按预期工作。
不过说真的,只需使用拔示巴的解决方案。
相关文章:
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 变量定义到C++布尔值转换
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 重载更少,则运算符返回相反的布尔值
- 将此布尔值传递给此函数的最有效方法是什么?
- 如何设置 c++ 类的布尔值?
- 使用 MAKEWORD / MAKEWPARAM 使用布尔值而不是布尔值
- 将 10 个线程与原子布尔值同步
- QT按钮组和可检查的按钮:如何将切换信号与整数和布尔值连接?
- 整数在 C++ 中没有被类型转换为布尔值
- 任何可以在单个 CPU 指令中在 0 和 1 之间翻转位/整数/布尔值的可能代码
- 如何接受 0 作为整数而不是布尔值
- 将整数算术与布尔值混合 - Z3 证明器
- 在比较过程中C++布尔值是否转换为整数
- C++ WIN32 在共享内存中创建整数和布尔值数组
- 将 0-1 整数 r 值转换为布尔值
- 0 或 1 以外的整数的布尔值是多少
- 将函数的整数返回值与 C++ 中的布尔值进行比较
- 使用布尔值表示整数
- 哪个值更好用?布尔值true或整数1