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;
当用户输入一个无效的东西时,例如一些char
s,这个循环将永远重复,而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<streamsize>::max()
而不是1024
。
您必须编辑您的答案,因为在用户输入空格之前,空格分隔符将不起作用。用户必须按 ENTER 才能找到 \n以上是关于cin.clear() 不会重置 cin 对象的主要内容,如果未能解决你的问题,请参考以下文章
cin.clear() 和 cin.ignore() 不起作用[关闭]
[转]cin.clear()cin.sync()和cin.ignore()的用法