我有以下循环。它应该读取数字,直到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
错误状态或停止。
答案 0 :(得分: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(),' ');
这在我看来更好,只要输入 space 分开(如果你不想检查无效输入)。 online doc说:
<强> istream的::忽略强>
istream的&安培; ignore(streamsize n = 1,int delim = EOF);
提取并放弃字符
从输入序列中提取字符并将其丢弃。
提取n个字符后,提取结束 丢弃或找到字符分隔时,以先到者为准。 在后一种情况下,也会提取delim字符本身。