C++ cin.clear()不';t重置cin对象
我有以下循环。它应该一直读取数字,直到C++ cin.clear()不';t重置cin对象,c++,inputstream,invalid-characters,C++,Inputstream,Invalid Characters,我有以下循环。它应该一直读取数字,直到结束文件,或者用户输入-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; } } int-arr[100]; 整数指数
结束文件
,或者用户输入-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;
}
}
int-arr[100];
整数指数;
对于(索引=0;索引<100;索引++)
{
cin>>arr[指数];
如果(!cin)
{
cin.clear();
索引--;
继续;
}
如果(arr[索引]=-999)
{
打破
}
}
当用户输入无效内容时,例如一些
char
s,此循环将永远重复,而clear
不会关闭错误状态或停止。调用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
无法读取无效输入时,它会保留在流中。必须通过某种方式将其移除。我只是读了,却忽略了它
您还可以使用忽略
作为:
cin.clear();
cin.ignore(std::numeric_limits<streamsize>::max(),' ');
cin.clear();
cin.ignore(标准::数值限制::max(),“”);
在我看来,如果输入是空间分隔的(如果您不想检查无效的输入),那么哪一个更好呢。报告说:
istream::忽略
i流&忽略(流大小n=1,int-delim=EOF)
提取和丢弃字符
从输入序列中提取字符并丢弃它们
提取n个字符后,提取结束
丢弃或在找到角色delim时,以先到者为准。
在后一种情况下,还将提取delim字符本身
@DDD先生:你提供了什么无效输入?你的第二个版本不工作。您正在输入
1024个
字符,或者在找到'
时输入。但是,用户不能在结尾处输入空格,输入将持续到1024个字符@DDD先生:你可以放一些更大的值,而不是1024
@Mr.DDD:那很好。但是,如果您在无效输入之后的同一行上有有效输入,该怎么办?顺便说一下,您可以使用std::numeric\u limits::max()
而不是1024
。您必须编辑您的答案,因为在用户输入空格之前,空格delim不起作用。用户必须按ENTER键才能找到\n