Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cin.clear()不';t重置cin对象_C++_Inputstream_Invalid Characters - Fatal编程技术网

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