【问题标题】:How to clear cin Buffer in c++如何在 C++ 中清除 cin 缓冲区
【发布时间】:2016-10-12 16:02:07
【问题描述】:

我已经在 StackOverflow 上查看了许多现有的答案,但我仍然卡住了。

代码:

int c;
cin >> c;

if(cin.fail()) {
   cout << "Wrong Input";
   cin.clear();
   cin.ignore(INT_MAX, '\n');
}
else
{
   cout << c*2;   
}

如果我输入 wring 输入,例如 s 而不是整数,它会输出 Wrong Input。但是,如果我输入一个整数,然后输入一个字符串,它会忽略该字符串并继续输出之前的整数结果,因此它不会清除 cin 缓冲区,并且 c 的旧值会继续执行。 任何人都可以建议cin.ignore()以外的最佳方法,因为它似乎不起作用。 是的,对我来说,cin.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n'); 中的 max() 会出错。所以这也不起作用。

【问题讨论】:

  • 你为什么不问一个问题来获得正确的方法来完成这项工作? This 是处理这种情况的正确方法。
  • 您能否让您的问题更清楚(例如提供minimal reproducible example)。我无法发现您的代码不应该使用的内容。我什至无法得到它compile
  • @NathanOliver 这给了我错误numeric_limits&lt;streamsize&gt;::max() max() 函数给我错误#define max(a,b) (((a) &gt; (b))) ? (a) : (b)) 即使我在我的文件中定义了这个语句。 @πάνταῥεῖ 我会尝试上传一个我认为可能更清晰的视频。
  • 您的代码中是否包含#define max(a,b) (((a) &gt; (b))) ? (a) : (b)) 或者您是否包含包含该内容的标头?

标签: c++ visual-studio visual-c++ buffer cin


【解决方案1】:

max() 函数需要在文件的开头定义。 cin.ignore() 可以很好地清除缓冲区,但是您需要数值限制函数 max(),在我的情况下它会给出错误。

解决方案:

#ifdef max
#define max
#endif

将这些行添加到顶部,如下所示的功能就可以正常工作了。

int id;
bool b;
do {
    cout << "Enter id: ";
    cin >> id;
    b = cin.fail();
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
} while ( b == true);

P.S:谢谢@Nathan

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多