【问题标题】:What the general purpose when using cin.clear? [duplicate]使用 cin.clear 的一般用途是什么? [复制]
【发布时间】:2017-12-30 17:49:59
【问题描述】:

我是 C++ 的初学者,我无法理解 cin.ignore 和 cin.clear 是什么,它们对我来说完全没有意义。当你向我解释这个时,请非常描述性

【问题讨论】:

    标签: c++ c++11 c++14


    【解决方案1】:

    在 C++ 输入处理中,如果最后一个 cin 命令失败,cin.fail() 将返回 true。

    通常,cin.fail() 在以下情况下会返回 true:

    1. 无论何时您到达EOF 并尝试阅读任何内容,cin.fail() 都会返回 true。
    2. 如果您尝试读取整数并且它收到无法转换为整数的内容。

    cin.fail() 返回真并发生错误时,cin 的输入缓冲区被置于“错误状态”。该状态会阻止进一步的输入处理。

    因此,您必须使用cin.clear()。它将覆盖流内部错误标志的当前值 => 所有位都替换为状态中的位,如果状态为好位,则清除所有错误标志。


    对于cin.ignore,首先它会通过首先构造一个sentry 对象来访问输入序列。之后,它从其关联的流缓冲区对象中提取字符,就像调用其成员函数sbumpcsgetc一样,最后在返回之前销毁哨兵对象。

    因此,它通常用于执行提取和丢弃字符。 cin.ignore 的一个经典案例是,当您在 cin 之后使用 getline() 时,它会在您的缓冲区中留下一个换行符,直到您切换功能。这就是您必须将换行符从缓冲区中清除的原因。

    【讨论】:

      【解决方案2】:

      std::cin.ignore() 可以三种不同的方式调用:

      无参数:从输入缓冲区中取出单个字符并丢弃:

      std::cin.ignore(); //discard 1 character
      

      一个参数:指定的字符数取自输入缓冲区并丢弃:

      std::cin.ignore(33); //discard 33 characters
      

      两个参数:丢弃指定的字符数,或丢弃直到并包括指定分隔符的字符(以先到者为准):

      std::cin.ignore(26, '\n'); //ignore 26 characters or to a newline, whichever comes first
      

      来源:http://www.augustcouncil.com/~tgibson/tutorial/iotips.html

      【讨论】:

      • 推荐的忽略是std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');,但是在一般意义上使用它时你必须小心一点。如果找不到换行符,它可能会等待几个 kaijuzillion 字符,这几乎是在浪费每个人的时间。
      • 小费和“kaijuzillion”这个词我喜欢它。
      • std::numeric_limits<std::streamsize>::max() 不仅仅是一个大数字。这是ignore() 的一个特殊情况,它禁用计数,因此它会消耗所有字符,包括分隔符。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-07
      • 2015-06-20
      • 1970-01-01
      • 2018-01-12
      • 2011-10-20
      • 2012-04-09
      • 2018-05-10
      相关资源
      最近更新 更多