前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ cin清理缓冲区

C++ cin清理缓冲区

作者头像
idealclover
发布2018-10-31 17:00:43
2.2K0
发布2018-10-31 17:00:43
举报
文章被收录于专栏:idealclover的填坑日常

C++在用cin做输入的时候,尤其是需要输入int型值的时候,往往需要做验证与处理。而对于异常值,则需要先清理缓冲区,再准备下一次输入。

对于清理缓冲区,中文世界的方法有一下几种(或者混着用):

代码语言:javascript
复制
cin.clear();
cin.ignore();
cin.sync();
fflush(stdin);

但是这几种方法都各有各的缺点,不是会造成重复输出错误信息,就是会造成不断的死循环。真正理想的解决方案,StackOverflow上给了很好的解答。那就是混合使用cin.ignore(INT_MAX, 'n')和cin.clear().

cin.clear()负责将置位置回,所有没有此步的解决方案都会陷入到cin.fail()的死循环中; cin.ignore('INT_MAX','n')负责将用户所一次性输入的多个字符全部舍弃,缺少第0个参数会使得错误信息持续输出(如果输入qwer则会输出四遍错误信息),缺少第1个参数则会忽略用户之后输入的全部信息(即使输对也没有反应)

示例代码如下:

代码语言:javascript
复制
while(true){
    cin >> cmd;
    if (cin.fail() || cmd < 0 || cmd > FUNC_NUM) {
        cin.clear();
        cin.ignore(INT_MAX,'\n');
        cout << "不合法的输入,请重新输入: ";
        continue;
    }else break;
}

参考资料

https://stackoverflow.com/questions/257091/how-do-i-flush-the-cin-buffer

版权声明

本作品由idealclover采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可,转载请注明出处

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考资料
  • 版权声明
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档