【问题标题】:Is there a function to retrieve integer input?是否有检索整数输入的功能?
【发布时间】:2011-06-04 04:07:40
【问题描述】:

这个有点具体。我希望能够使用函数而不是 cin 从用户那里检索整数。 我尝试了几种不同的方法,但似乎都不起作用,所以我刚刚结束了编写自己的函数。但它确实让我感到困惑,因为它似乎已经存在某种功能。这里是:

int getInt()
{
   int num;
   cin >> num;
   return num;
}

我尝试过使用 cin.get(),但它返回整数的 ascii 数字。 getline() 函数都用于字符串。这个功能不存在是没有意义的!如果您知道任何可以作为参数传递给函数的函数或内联等效函数,请告诉我。

【问题讨论】:

  • 你知道,>> 是这里的一个函数。
  • 为什么你认为这个功能应该存在?编写自己的代码很容易。请注意,您的函数非常具体,编写它的功能很容易获得。你认为 C++ 标准库应该有多大?
  • 您这样做是为了在一行中声明和初始化吗? int x = getInt();
  • 此函数缺少主要功能:即如果读取因任何原因失败,它会返回一个未定义的值。这是一件坏事。

标签: c++ function input integer


【解决方案1】:

C++ 使用运算符(在本例中为 >>)来获取输入,这与使用函数的 Java 不同。您可以构建自己的数字解析器,但标准 C++ 没有内置。

【讨论】:

    【解决方案2】:

    没有标准的函数可以做你想做的事。

    【讨论】:

      【解决方案3】:

      当您执行您发布的操作时,您已经在使用一个函数。调用operator>> 的替代语法使这更清楚:

         int num;
         cin.operator>>(num);
         return num;
      

      这是 Visual C++ v10 标头中该函数的代码:

      _Myt& __CLR_OR_THIS_CALL operator>>(int& _Val)
          {   // extract an int
          ios_base::iostate _State = ios_base::goodbit;
          const sentry _Ok(*this);
      
          if (_Ok)
              {   // state okay, use facet to extract
              long _Tmp = 0;
              const _Nget& _Nget_fac = _USE(ios_base::getloc(), _Nget);
      
              _TRY_IO_BEGIN
              _Nget_fac.get(_Iter(_Myios::rdbuf()), _Iter(0),
                  *this, _State, _Tmp);
              _CATCH_IO_END
      
              if (_State & ios_base::failbit
                  || _Tmp < INT_MIN || INT_MAX < _Tmp)
                  _State |= ios_base::failbit;
              else
                  _Val = _Tmp;
              }
      
          _Myios::setstate(_State);
          return (*this);
          }
      

      【讨论】:

      • 嗯,我真正在寻找的是一个现有的功能,它可以完成我上面的整体功能。这样你就可以像这样将它作为参数传递:
      • for(int num = getInt(); num != 42; num++)
      • 那个循环对我来说没有意义 - 你想要类似:while (cin.operator&gt;&gt;(num) &amp;&amp; num != 42) 吗?
      • 而且@Steve 的代码可以更简单,while (cin &gt;&gt; num &amp;&amp; num != 42)!
      • 不是每次都调用它吗?我只希望它在开始时被调用一次,然后在每个循环结束时被调用。我可以将它放在循环之前,但我希望仅将变量保留在我使用它的范围内(我是垃圾邮件变量的狂热敌人。)要查看我正在谈论的确切上下文,请查看名为“生命、宇宙和一切”的 Code Chef 的简单挑战。我的循环代码最终为: for(int num = getInt(); num != 42; cin >> num) cout
      猜你喜欢
      • 1970-01-01
      • 2016-05-19
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      相关资源
      最近更新 更多