std :: cin.fail()在c ++中没有像预期的那样工作

时间:2014-05-20 19:58:14

标签: c++

我试图从标准输入中读取一个整数,并且我有这个代码几乎就是这样,并且如果用户输入字母则再次提示。但是,它有一个问题,如果用户输入一个像6.9这样的浮点数,那么这被接受为有效输入并且函数结束。

int nr=0;
std::cout << "Vector length: ";
std::cin >> nr;

while (std::cin.fail() ) {
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<int>::max(), '\n');
    std::cout << "Input is not number , try one more time: ";
    std::cin >> nr;
}

我想检测所有错误的输入。如何更改我的代码以将浮点数视为无效?

1 个答案:

答案 0 :(得分:2)

执行以下操作:

      int nr = 0;
      std::cout << "Vector length: ";
      while (!(std::cin >> nr)) {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<int>::max(), '\n');
        std::cout << "Input is not number , try one more time: ";
      }

但是,上述代码将适用于浮点(例如,“9.8”)。如果输入EOF,它还将创建无限循环。如果您想要严格的积分值,请执行以下操作:

#include <iostream>
#include <cctype>
#include <string>
#include <algorithm>

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();
}

int main()
{
  std::string num;
  std::cout << "Vector length: ";
  std::getline(std::cin, num);
  while (!is_number(num)) {
    std::cout << "Input is not number , try one more time: ";
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<int>::max(), '\n');
    num.clear();
    std::getline(std::cin, num);
  }
  return 0;
}