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

时间:2010-04-04 03:13:11

标签: c++

清除cin输入的更好方法是什么?我认为cin.clearcin.ignore是一个好方法吗?

代码:

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

}

我老师给了我这个回复:

  这基本上是说你的   clearInput不起作用FYI:忽略   从来都不是一个好主意   摆脱所有剩下的东西   线

     

你的测试失败了   之所以现在明白了   正确的方式

她还告诉我以下内容:

  

忽略你需要猜测如何   你要忽略的许多字符如果   你绝对知道你的数据和它   遵循严格的格式 - 如在Excel中   电子表格,忽略真的很好。   如果您不在此类文件中,   然后你永远不要使用忽略。题,   你的数据是否格式良好?如果是,请使用   忽视。如果没有,请不要使用忽略。

     

列出所有获取数据的方式? 1)   有提取&gt;&gt;

     

还有??????

     

请为我列出

2 个答案:

答案 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,您的老师原则上是错误的:ignorethe standard idiom如何清除流(如Potatocorn所示,标准中甚至提到了这一点)。< / p>

但是,重要的是要注意cin.ignore(1000) 确实这是一种不好的方法:这只是假设缓冲区中不会超过1000个字符。切勿在{{1​​}}中使用这样的幻数。

相反,要么使用

  1. ignore(即读取缓冲区中可用的字符数) 1),或者使用
  2. cin.rdbuf()->in_avail()

  3. 1)不幸的是,numeric_limits<streamsize>::max()在最近的一些VC(?)编译器上被破坏了,所以这种方法不是很便携。