清除cin输入:是cin.ignore不是一个好方法?

cod*_*ail 8 c++

清除cin输入的更好方法是什么?我想cin.clear,这cin.ignore是一个好方法?

码:

 void clearInput()
{   
    cin.clear();
    cin.ignore(1000,'\n');
    //cin.ignore( std::numeric_limits<streamsize>::max(), '\n' );

}
Run Code Online (Sandbox Code Playgroud)

我老师给了我这个回复:

这基本上是说你的clearInput不起作用FYI:忽略绝不是一个好主意,可以摆脱所有遗留在一条线上

而你的测试失败正是为什么现在以正确的方式清除它的原因

她还告诉我以下内容:

忽略你需要猜测你想忽略多少个字符如果你完全知道你的数据并且它遵循严格的格式 - 就像在Excel电子表格中一样,忽略真的很好.如果你不在这种类型的文件中,那么你永远不要使用忽略.问题,您的数据是否格式良好?如果是,请使用ignore.如果没有,请不要使用ignore.

列出所有获取数据的方式?1)有提取>>

而且还有??????

请为我列出

Kon*_*lph 6

你老师\xe2\x80\x99的回复有点不清楚(至少对我来说)。

\n\n

关于ignore,你的老师在原则上是错误的:ignore是如何清除溪流的标准习语(如 Potatocorn 所示,甚至在标准中提到了这一点)。

\n\n

然而,重要的是要注意,这确实cin.ignore(1000)是一种不好的方法:这只是假设缓冲区中不会有超过 1000 个字符。切勿在.ignore

\n\n

相反,要么使用

\n\n
    \n
  1. cin.rdbuf()->in_avail()(即读取缓冲区中的可用字符数)1),或使用
  2. \n
  3. numeric_limits<streamsize>::max()
  4. \n
\n\n
\n\n

1)不幸的是,in_avail在一些最近的 VC (?) 编译器上被破坏了,所以这个方法\xe2\x80\x99t 不是非常可移植的。

\n


Pot*_*ter 5

从标准复制粘贴,

basic_istream<charT,traits>&
ignore(streamsize n = 1, int_type
delim = traits::eof());
Run Code Online (Sandbox Code Playgroud)

效果:表现为无格式输入函数(如27.6.1.3第1段所述).构造一个岗位对象后,提取字符并丢弃它们.提取字符,直到出现以下任何一种情况:

  • if 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是非阻塞行为,即如果终端处于无缓冲模式,则不要等待用户按返回.但据我所知,这完全不受iostream的支持.