【发布时间】:2017-12-30 17:49:59
【问题描述】:
我是 C++ 的初学者,我无法理解 cin.ignore 和 cin.clear 是什么,它们对我来说完全没有意义。当你向我解释这个时,请非常描述性
【问题讨论】:
我是 C++ 的初学者,我无法理解 cin.ignore 和 cin.clear 是什么,它们对我来说完全没有意义。当你向我解释这个时,请非常描述性
【问题讨论】:
在 C++ 输入处理中,如果最后一个 cin 命令失败,cin.fail() 将返回 true。
通常,cin.fail() 在以下情况下会返回 true:
EOF 并尝试阅读任何内容,cin.fail() 都会返回 true。 当cin.fail() 返回真并发生错误时,cin 的输入缓冲区被置于“错误状态”。该状态会阻止进一步的输入处理。
因此,您必须使用cin.clear()。它将覆盖流内部错误标志的当前值 => 所有位都替换为状态中的位,如果状态为好位,则清除所有错误标志。
对于cin.ignore,首先它会通过首先构造一个sentry 对象来访问输入序列。之后,它从其关联的流缓冲区对象中提取字符,就像调用其成员函数sbumpc或sgetc一样,最后在返回之前销毁哨兵对象。
因此,它通常用于执行提取和丢弃字符。 cin.ignore 的一个经典案例是,当您在 cin 之后使用 getline() 时,它会在您的缓冲区中留下一个换行符,直到您切换功能。这就是您必须将换行符从缓冲区中清除的原因。
【讨论】:
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 字符,这几乎是在浪费每个人的时间。
std::numeric_limits<std::streamsize>::max() 不仅仅是一个大数字。这是ignore() 的一个特殊情况,它禁用计数,因此它会消耗所有字符,包括分隔符。