【问题标题】:cin.clear() doesn't reset cin objectcin.clear() 不会重置 cin 对象
【发布时间】:2011-11-16 19:32:48
【问题描述】:

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

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

【问题讨论】:

    标签: c++ inputstream invalid-characters


    【解决方案1】:

    在调用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& 忽略(streamsize n = 1, int delim = EOF);

    提取和丢弃字符

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

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

    【讨论】:

    • @Mr.DDD:你提供了什么无效输入?
    • 您的第二个版本不起作用。您正在寻找 1024 字符或找到 ' ' 时。但是,用户最后可能不输入空格,输入将继续到 1024 个字符!
    • @Mr.DDD:你可以放一些更大的值,而不是1024
    • @Mr.DDD:很好。但是,如果您在无效输入之后的同一行中有有效输入怎么办?顺便说一句,您可以使用std::numeric_limits&lt;streamsize&gt;::max() 而不是1024
    • 您必须编辑您的答案,因为在用户输入空格之前,空格分隔符将不起作用。用户必须按 ENTER 才能找到 \n
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 2021-09-13
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    相关资源
    最近更新 更多