cin.clear()不会重置cin对象

问题描述 投票:9回答:1

我有以下循环。它应该读取数字,直到EndOfFile或用户输入-999

int arr[100];

int index;

for (index = 0; index < 100; index++)
{
 cin >> arr[index];
 if (!cin)
 {
  cin.clear();
  index--;
  continue;
 }
 if (arr[index] == -999)
 {
     break;
 }
}

当用户输入无效的东西时,例如某些chars,这个循环正在重复,没有clearing错误状态或停止。

c++ inputstream invalid-characters
1个回答
9
投票

在调用clear之后,您还必须以某种方式从流中删除无效输入。这是一种方式:

 cin >> arr[index];
 if (!cin)
 {
  cin.clear();
  std::string ignoreLine; //read the invalid input into it
  std::getline(cin, ignoreLine); //read the line till next space
  index--;
  continue;
 }

这是因为当cin无法读取无效输入时,它仍保留在流中。必须通过某种方式将其删除。我只是阅读并忽略它。

你也可以使用ignore作为:

cin.clear();
cin.ignore(std::numeric_limits<streamsize>::max(),' ');

在我看来哪个更好,只要输入是空格分隔的(如果你不想检查无效输入)。 online doc说:

的IStream ::忽视

istream&ignore(streamsize n = 1,int delim = EOF);

提取并丢弃字符

从输入序列中提取字符并将其丢弃。

当提取并丢弃n个字符或找到字符分隔时,提取结束,以先到者为准。在后一种情况下,还提取了delim字符本身。

© www.soinside.com 2019 - 2024. All rights reserved.