使用带有cin的ios :: clear()

时间:2015-08-30 14:52:19

标签: c++ cin

#include <iostream>

int main() {
    int arr[4];

    for(int I = 0; I != 4; ++i) {
        std::cin >> arr[i];

        if(std::cin.fail()) {
            std::cin.clear();
            --i;
            break;
        }
    }
    for (auto u : arr)
        std::cout << u << '\n';
}

我不明白为什么这段代码不起作用。如果std::cin返回true,我希望再次arr std::cin.fail()的元素。

1 个答案:

答案 0 :(得分:0)

break将终止循环。那不是你想要的。

另请注意,您不会从流中删除有问题的字符,因此您的下一个问题将是无限循环。

但是,即使删除有问题的字符,也可能会进入无限循环,因为输入流中可能根本没有四个有效整数。

这是一个只在循环中更新i的解决方案。

#include <iostream>
#include <cstdlib>

int main()
{
  int arr[4];

  for(int i = 0; i != 4; /* this field intentionally left empty */)
  {
    std::cin >> arr[i];

    if(std::cin) // did the read succeed?
    {
      ++i; // then read the next value
    }
    else
    {
      if (std::cin.eof()) // if we've hit EOF, no integers can follow
      {
        std::cerr << "Sorry, could not read four integer values.\n";
        return EXIT_FAILURE; // give up
      }
      std::cin.clear();
      std::cin.ignore(); // otherwise ignore the next character and retry
    }
  }

  for (auto u : arr)
    std::cout << u << '\n';
}

但是整个事情变得脆弱,输入的解释可能与用户的意图不同。如果遇到无效输入,最好放弃:

#include <iostream>
#include <cstdlib>

int main()
{
  int arr[4];

  for (auto& u: arr)
    std::cin >> u;

  if (!std::cin) // Did reading the four values fail?
  {
    std::cerr << "Sorry, could not read four integer values.\n";
    return EXIT_FAILURE;
  }

  for (auto u: arr)
    std::cout << u << "\n";
}