我有以下循环。它应该读取数字,直到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
ing错误状态或停止。
在调用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&ignore(streamsize n = 1,int delim = EOF);
提取并丢弃字符
从输入序列中提取字符并将其丢弃。
当提取并丢弃n个字符或找到字符分隔时,提取结束,以先到者为准。在后一种情况下,还提取了delim字符本身。