【问题标题】:How do I accept 0 as an integer and not a bool value?如何接受 0 作为整数而不是布尔值?
【发布时间】:2017-04-11 07:43:44
【问题描述】:

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

【问题讨论】:

  • while (!num) 表示如果num0则进入循环
  • 你的检查逻辑坏了。 num 始终是整数。
  • 你应该检查cin &gt;&gt; num的返回值。
  • 你只得到整数,你只使用num 进行条件检查,它的行为符合预期。如果你解释你的用例,那么它可能会更有帮助。
  • num 始终是一个整数。如果有人输入一个字符串,cin &gt;&gt; num; 会抛出。

标签: c++


【解决方案1】:

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

最简单的方法是使用类似的东西

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

如果您想自己验证输入,请考虑读取std::string 并检查是否可以将其转换为整数。这是非常重要的,因为int 可以采用的可能值非常依赖于平台(某些系统的范围小至-32767 到+32767)。

如果可以,请使用boost::lexical_cast&lt;int&gt;(num);,我已将num 升级为std::string 类型。 (你需要的标题是&lt;boost/lexical_cast.hpp&gt;)。

【讨论】:

  • 谢谢!写这段代码的时候我一定很累,因为我过去肯定用这种方式验证过输入。欣赏!
【解决方案2】:

在 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&lt;int&gt; num,然后瞧——您的代码按预期工作。

说真的,请使用 Bathsheba 的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-13
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 2022-06-13
    相关资源
    最近更新 更多