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

C++ 清除cin输入:cin.ignore不是一个好方法吗?,c++,C++,清除cin输入的更好方法是什么?我认为cin.clear和cin.ignore是一个好方法 代码: void clearInput() { cin.clear(); cin.忽略(1000,“\n”); //cin.ignore(std::numeric_limits::max(),'\n'); } 我的老师给了我这样的回答: 这基本上是说你的 clearInput不工作仅供参考:忽略 这从来都不是一个好主意 把剩下的都扔掉 线 你这次考试不及格正是因为 为什么现在要把它弄清楚 正道 她

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

代码:

void clearInput()
{   
cin.clear();
cin.忽略(1000,“\n”);
//cin.ignore(std::numeric_limits::max(),'\n');
}
我的老师给了我这样的回答:

这基本上是说你的 clearInput不工作仅供参考:忽略 这从来都不是一个好主意 把剩下的都扔掉 线

你这次考试不及格正是因为 为什么现在要把它弄清楚 正道

她还告诉我:

在“忽略”上,您需要猜测如何忽略 如果出现以下情况,则需要忽略许多字符: 你绝对知道你的数据和它 遵循严格的格式--如Excel中的格式 电子表格,忽略真的很好。 如果您不在此类文件中, 那么你永远不会使用忽略。问题:, 你的数据格式正确吗?如果是,请使用 忽略。如果不是,不要使用忽略

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

还有呢??

请给我列一张单子


从标准中复制粘贴

basic\u istream&
忽略(streamsize n=1,int_类型
delim=traits::eof());
效果:表现为未格式化的 输入功能(如中所述 27.6.1.3,第1段)。在建造了一个哨兵对象之后, 提取字符并丢弃它们。 提取字符,直到其中任何一个 发生以下情况:

  • 如果
    n!=数值限制::max()
    (18.2.1),
    n
    字符被提取
  • 文件结尾出现在输入序列上(在这种情况下,函数 调用设置状态(eofbit),可能 抛出
    ios_base::失败
    (27.4.4.3))
  • c==delim
    用于下一个可用输入字符
    c
    (在这种情况下,
    c
    为 摘录)
您用
numeric\u limits::max
对行进行了注释,这是很好的,但看起来您不想使用您不完全理解的内容,这也是很好的


除了忽略之外,人们可能想要的唯一东西是非阻塞行为,即如果终端处于非缓冲模式,不要等待用户按return键。但据我所知,iostreams完全不支持这一点。

你老师的回答有点不清楚(至少对我来说是这样)

关于
忽略
,您的老师原则上是错误的:
忽略
是关于如何清除流的问题(如Potatocorn所示,标准中甚至提到了这一点)

但是,需要注意的是,
cin.ignore(1000)
确实是一种不好的方法:这只是假设缓冲区中的字符不会超过1000个。千万不要在
忽略
中使用这样一个神奇的数字

相反,使用

  • cin.rdbuf()->in_avail()
    (即读取缓冲区中可用的字符数)1),或使用
  • 数值限制::max()


  • 1) 不幸的是,在最近的一些VC(?)编译器上,
    in\u avail
    被破坏了,所以这种方法不是很好移植。

    为什么?他认为“忽略”是“忽略”的意思吗?它提取并抛出角色,大概是他想让你手工做的。听起来你的老师有点吝啬。据我所知,
    清除
    然后
    忽略
    是清除行的标准方法。然后我的流知识又低了。我会比“有点吝啬”更进一步。祝你在课堂上好运,听起来你应该“忽略”他。是的,老师的答案很短,而且肯定比吝啬多了。如果我使用字符串垃圾怎么办;cin>>垃圾?这只能读取到第一个空格;要阅读整篇文章,你可以使用global
    getline
    函数(顺便说一句,很抱歉在你的另一个问题中建议
    ignore
    ,因为这似乎是错误的答案!虽然我仍然不明白为什么;))对,我不太确定她想从我这里得到什么。。有提取(>>),我猜她想到的另一个是getline?在这方面可以使用cin.getline和cin.clear吗?我如何知道输入是否已被清除?@igor:您可以反复
    getline
    (或
    get
    )直到发出EOF或故障信号。但我不认为这在任何方面都优于
    忽略
    。她在回答我为什么不能像红鼻子独角兽所指出的那样使用忽略时指出:“什么在所有情况下都有效?”——很简单:我上面发布的两个代码中的任何一个。无论用户输入了多少个字符,这些代码都会起作用,因为它们是这样定义的!是的,那当然行。我仍然不知道她想要什么哈哈。TILT:“如果n!=numeric_limits::max()(18.2.1),则提取n个字符。”。但是,没有提到当n==numeric_limits::max()时会发生什么@凯西,这是无限的
    numeric_limits::max()
    很少小于4 GB,因此如果您需要完全忽略4 GB+1,那就太倒霉了。
     void clearInput()
    {   
        cin.clear();
        cin.ignore(1000,'\n');
        //cin.ignore( std::numeric_limits<streamsize>::max(), '\n' );
    
    }
    
    basic_istream<charT,traits>&
    ignore(streamsize n = 1, int_type
    delim = traits::eof());