清除cin
输入的更好方法是什么?我认为cin.clear
和cin.ignore
是一个好方法吗?
代码:
void clearInput()
{
cin.clear();
cin.ignore(1000,'\n');
//cin.ignore( std::numeric_limits<streamsize>::max(), '\n' );
}
我老师给了我这个回复:
这基本上是说你的 clearInput不起作用FYI:忽略 从来都不是一个好主意 摆脱所有剩下的东西 线你的测试失败了 之所以现在明白了 正确的方式
她还告诉我以下内容:
忽略你需要猜测如何 你要忽略的许多字符如果 你绝对知道你的数据和它 遵循严格的格式 - 如在Excel中 电子表格,忽略真的很好。 如果您不在此类文件中, 然后你永远不要使用忽略。题, 你的数据是否格式良好?如果是,请使用 忽视。如果没有,请不要使用忽略。
列出所有获取数据的方式? 1) 有提取&gt;&gt;
还有??????
请为我列出
答案 0 :(得分:5)
从标准中复制粘贴,
basic_istream<charT,traits>& ignore(streamsize n = 1, int_type delim = traits::eof());
效果:表现为无格式化 输入功能(如 27.6.1.3,第1段)。构建哨兵对象后, 提取字符并丢弃它们。 提取字符直到任何一个 发生以下情况:
- 如果
n != numeric_limits<streamsize>::max()
(18.2.1),提取n
个字符- 文件结束发生在输入序列上(在这种情况下是函数 可以调用
setstate(eofbit)
抛出ios_base::failure
(27.4.4.3));c == delim
代表下一个可用的输入字符c
(在这种情况下c
是 萃取)。
您评论numeric_limits<>::max
行是优越的,但看起来您不想使用您不完全理解的内容,这也很好。
除ignore
之外,除了{{1}}之外,唯一可能想要的是非阻塞行为,即如果终端处于无缓冲模式,则不要等待用户按返回。但据我所知,这完全不受iostream的支持。
答案 1 :(得分:4)
你老师的回答有点不清楚(至少对我而言)。
关于ignore
,您的老师原则上是错误的:ignore
是the standard idiom如何清除流(如Potatocorn所示,标准中甚至提到了这一点)。< / p>
但是,重要的是要注意cin.ignore(1000)
确实这是一种不好的方法:这只是假设缓冲区中不会超过1000个字符。切勿在{{1}}中使用这样的幻数。
相反,要么使用
ignore
(即读取缓冲区中可用的字符数) 1),或者使用cin.rdbuf()->in_avail()
。 1)不幸的是,numeric_limits<streamsize>::max()
在最近的一些VC(?)编译器上被破坏了,所以这种方法不是很便携。