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

Posted

技术标签:

【中文标题】cin.clear() 不会重置 cin 对象【英文标题】:cin.clear() doesn't reset cin object 【发布时间】:2011-11-16 19:32:48 【问题描述】:

我有以下循环。它应该读取数字直到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,这个循环将永远重复,而clear没有错误状态或停止。

【问题讨论】:

【参考方案1】:

在调用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& 忽略(streamsize n = 1, int delim = EOF);

提取和丢弃字符

从输入序列中提取字符并丢弃它们。

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

【讨论】:

@Mr.DDD:你提供了什么无效输入? 您的第二个版本不起作用。您正在寻找 1024 字符或找到 ' ' 时。但是,用户最后可能不输入空格,输入将继续到 1024 个字符! @Mr.DDD:你可以放一些更大的值,而不是1024 @Mr.DDD:很好。但是,如果您在无效输入之后的同一行中有有效输入怎么办?顺便说一句,您可以使用std::numeric_limits&lt;streamsize&gt;::max() 而不是1024 您必须编辑您的答案,因为在用户输入空格之前,空格分隔符将不起作用。用户必须按 ENTER 才能找到 \n

以上是关于cin.clear() 不会重置 cin 对象的主要内容,如果未能解决你的问题,请参考以下文章

cin.clear() 和 cin.ignore() 不起作用[关闭]

[转]cin.clear()cin.sync()和cin.ignore()的用法

cin.good(),cin.fail(),cin.clear()

清空缓存区,避免对缓存区中残留数据对下次读入造成影响

第六章 分支语句和逻辑运算符

cin与CTRL+z的问题