10

我有以下循环。它应该读取数字直到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;
 }
}

当用户输入一个无效的东西时,例如 some chars,这个循环将永远重复,而不会clear出现错误状态或停止。

4

1 回答 1

10

调用后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(),' ');

如果输入是空格分隔的(如果您不想检查无效输入),我认为这更好。在线文档说:

istream::忽略

istream& 忽略(streamsize n = 1,int delim = EOF);

提取和丢弃字符

从输入序列中提取字符并丢弃它们。

当 n 个字符被提取并丢弃或找到字符分隔符时,提取结束,以先到者为准。在后一种情况下,delim 字符本身也被提取。

于 2011-09-14T08:22:25.633 回答