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

11
我有以下循环。它应该读取数字直到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;
 }
}

当用户输入无效的东西,比如一些 char,这个循环会持续不断地重复,而不清除错误状态或停止。

1个回答

11

在调用 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(),' ');
在我看来,如果输入是以空格分隔的(并且您不想检查无效的输入),istream::ignore 是更好的选择。根据在线文档的说明: istream::ignore istream& ignore( streamsize n = 1, int delim = EOF ); 提取并丢弃字符 从输入序列中提取字符并将其丢弃。
当提取并丢弃了n个字符或找到字符delim时,提取过程就结束了,以先出现的那个为准。在后一种情况下,delim字符本身也会被提取。

@Mr.DDD:您提供了什么无效的输入? - Nawaz
你的第二个版本不起作用。你忽略了 1024 个字符或找到 ' '(空格)。然而,用户可能不会在末尾输入空格,并且输入将继续到 1024 个字符! - user586399
@Mr.DDD:你可以使用一些更大的值,而不是 1024 - Nawaz
1
@Mr.DDD:这很好。但是,如果无效输入之后的同一行上有有效输入呢?顺便说一下,你可以使用std::numeric_limits<streamsize>::max()代替1024 - Nawaz
你需要编辑你的回答,因为只有在用户输入空格后,使用空格分隔符才能正常工作。用户必须按ENTER键以便找到 \n。 - user586399
@Mr.DDD:我刚刚添加了“[...]如果提供的输入是以空格分隔”。 - Nawaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接