【问题标题】:Cin read number and check for integer [duplicate]Cin 读取数字并检查整数 [重复]
【发布时间】:2014-07-25 08:59:36
【问题描述】:

喂,

我想用 cin 函数读取 c++ 中的数字。我知道有很多线程,但我没有找到完美的解决方案。

首先我尝试了 cin.fail() 函数。但是如果我输入这样的数字 12asdf 它会读取 12 正确并且没有抛出错误。

然后我尝试读取一个字符串并使用 atoi() 函数对其进行转换,但如果我读取这样的字符串 12asdf 我会遇到同样的问题。它读取 12 正确并且没有抛出错误。

我尝试使用该功能,但 all_of 功能在 Visual 2013 中不可用。

if ( std::all_of(input.begin(), input.end(), std::isdigit) )
{
     //input is integer
}

如何检查这样的输入 12asdf 并抛出错误?

最好的问候

【问题讨论】:

  • IIRC, boost::lexical_cast 检查整​​个字符串。

标签: c++ numbers integer


【解决方案1】:

您可以使用以下功能:

bool is_number(const std::string& s) {
  return !s.empty() && std::find_if(s.begin(),
    s.end(), [](char c) { return !std::isdigit(c); }) == s.end();
}

然后像下面这样使用它:

  std::string num;
  std::cout << "Enter number: ";
  std::getline(std::cin, num);
  while (!is_number(num)) {
    std::cout << "Input is not a number , enter again: ";
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    num.clear();
    std::getline(std::cin, num);
  }

【讨论】:

  • 使用否定参数调用std::isdigit 将导致未定义的行为(除非该值恰好是EOF)。因此,std::isdigit(c) 应更改为std::isdigit(static_cast&lt;unsigned char&gt;(c))。有关这背后的原因,请参阅 this answer 另一个问题。
猜你喜欢
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 2019-02-06
  • 2017-05-27
  • 2016-09-05
相关资源
最近更新 更多