首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cin.clear()不重置cin对象

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

Stack Overflow用户
提问于 2011-09-14 16:17:11
回答 1查看 10.7K关注 0票数 10

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

代码语言:javascript
复制
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,这个循环将永远重复,而不会进入错误状态或停止。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-14 16:22:26

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

代码语言:javascript
复制
 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用作:

代码语言:javascript
复制
cin.clear();
cin.ignore(std::numeric_limits<streamsize>::max(),' ');

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

istream::ignore

istream& ignore(流大小n= 1,int delim = EOF );

提取和丢弃字符

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

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

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7413247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档