cin的用法很简单,但是一不小心就会出问题,考虑下面的情况:

    double test;std::cout << "请输入double数字,结束请输入'q':" << std::endl;while (std::cin >> test){std::cout << test << std::endl;}int test2;while (std::cin >> test2){std::cout << test2 << std::endl;}

test循环完成后,用户按了’q’,之后还会进入第二个test2循环么?

不会,因为cin的状态已经是错误状态了,需要重新恢复为可用状态,也就是通过 “ cin.clear() ” 进行重置,但重置后就能进入么?

还是不行,为什么?

因为缓冲中还有一个字符 ‘q’ ,如果不解决这个问题,那么cin仍然会变为错误状态,此时就需要引入另外一个函数 “cin.ignore()" 去除最后输入的字母 ‘q’ ,之后cin会自动跳过换行符,进行数据输入。

以为这就结束了?请问如果用户输入的是 “quit” 这个单词会怎样?

cin仍会置错,因为缓冲区没有清空,且不是int类型,所以需要再进一步,用 “ cin.ignore(10, ‘\n’) ” 来解决问题,这个用法的意思是,去除缓冲区10个以内的字符,直到遇到换行符。

如果不是碰到比较疯狂的用户,疯狂乱输入,基本问题就解决了。

但是,程序员只能做到自己能做到的,用户端是无法把控的,不要轻视程序使用者的脑洞,所谓完美的程序,需要对的人使用。

另外,如果程序设计的比较完善,通常会设计不必破坏流状态的代码,如:

    double test;std::cout << "请输入double数字,结束请输入 0 :" << std::endl;while (std::cin >> test){if(test==0) { break; }std::cout << test << std::endl;}if (cin.fail()){cin.clear();cin.ignore(10, '\n');}

按照一般指示,输入0即可退出,但是就算输入字母也有后序的判断,清理状态。

不要以为这就完了。还有什么问题呢?

如果一个用户使用文件流进行输入,又多了一种状态,叫文件结尾,文件结尾也会令流退出,如果此时再强制清空流状态企图恢复,也会产生问题。

所以,我们只需要复位除文件末尾的其他错误状态:

    if (cin.fail()){cin.clear(cin.rdstate() & ~std::istream::failbit & ~std::istream::badbit);cin.ignore(10, '\n');}

上面代码设计位操作,将cin的状态进行 “位与 ”,“位求反fail状态”,“位与”,“位求反bad状态”.

假设目前cin状态为0100,即fail状态,恢复过程用二进制表示:

0100 & ~0100 & ~ 0001

结果为 0000,如果cin的状态为eof结尾状态,0010,则上述位运算结果仍是0010,就可以退出了。

写道最后,好像是C++流操作的劝退文,没关系,当初我看流状态这章的时候也是懵逼的,经过程序拷打几回,自然就会研究,掌握了。

2022-04-03 关于C++中标准输入cin失效的问题相关推荐

  1. 金融帝国实验室(Capitalism Lab)官方中文整合包(MOD模组/专业XGQ)_v8.0.15(2022.04.03更新)

    为了方便喜欢加载MOD模组以丰富游戏性以及通过XG体验更多乐趣的CapLab玩家们,Enlight官方中文社群特别制作推出最新正版中文整合包! --------------- ◎版本号:V8.0.15 ...

  2. gnome桌面打造日常使用操作系统(支持Arch Linux、Fedora、Ubuntu)(2022.04.17更新)

    更新日志 日期 内容 2022.04.03 完成初稿 2022.04.05 更新sublime和imwheel 2022.04.06 添加所有软件在Feroda的安装方法 2022.04.07 添加所 ...

  3. 硬件大熊原创合集(2022/04更新)

    2022/04月份更新的篇章 智能门锁:NFC刷卡 智能门锁:触摸设计注意事项 面试题:高速电路是什么,什么信号算高速? 高速线路PCB设计:传输线效应 那些大咖们 刘未鹏是我在大学时知道的一位大牛, ...

  4. AI公开课:19.04.03周明—MSRA副院长《NLP的进步如何改变搜索的体验》课堂笔记以及个人感悟

    AI公开课:19.04.03周明-MSRA副院长<NLP的进步如何改变搜索的体验>课堂笔记以及个人感悟 导读        周明博士,1999年加入微软研究院(MSRA).现任微软亚洲研究 ...

  5. c++ 中的 cin.get()函数

    cin.get作用:从标准输入吸收任何字符(包括回车和空格),优先吸收cin缓存(之前cin的残留内容). #include <iostream> #include <sstream ...

  6. 2022.04.17-高宝琪毕设阶段性汇报

    第12次汇报 (2022.04.17) 实现了第三部分(分析数字化的心电数据)! 并将二.三两部分("纸质心电图数字化"和"分析数字化的心电数据")连通成了一个 ...

  7. 2022.04精灵宝可梦国内在线观看渠道整理

    目前只整理TV版 精灵宝可梦无印(EP) 271话 哔哩哔哩 精灵宝可梦超世代(AG) 188话 哔哩哔哩 精灵宝可梦钻石与珍珠(DP) 185话 哔哩哔哩 精灵宝可梦超级愿望(BW) 144话 哔哩 ...

  8. 音视频面试题集锦 2022.04

    下面是 2022.04 月音视频面试题集锦内容的节选: 1)RTMP 消息分优先级的设计有什么好处? RTMP 的消息优先级是:控制消息 > 音频消息 > 视频消息.当网络传输能力受限时, ...

  9. Dapr中国社区活动之 分布式运行时开发者日 (2022.09.03)

    自2019年10月首次发布以来,Dapr(Distributed Application Runtime,分布式应用运行时)因其"更稳定"."更可靠".&quo ...

最新文章

  1. UI设计培训分享:平面广告设计中的文案表达技巧
  2. Win10 无需安装虚拟机/双系统使用 linux
  3. java同步关键字_Java中synchronized关键字修饰方法同步的用法详解
  4. Android生成Xml文件
  5. Spring Boot 2中的功能切换
  6. 计算机软件选修课选什么好,大学值得选的“选修课”,一点不比专业课差,能选上最好认真听...
  7. 永洪报表工具_2020年最值得推荐的五大BI工具
  8. Tensorflow(r1.4)API--tf.nn.max_pool
  9. bat 命令返回结果_【批处理】带你入门命令行
  10. VS2015安装破解版Visual Assist X
  11. 论mybatisPlus 连表插件(MPJBaseMapper) 与自定义SQL注入器冲突
  12. 安全事件应急响应工具箱
  13. 枚举——数组中的最长山脉
  14. 抖音小程序是什么_如何开发抖音小程序
  15. BIOS 中断向量表
  16. 高手支招 ASP+Access的安全隐患及对策(转)
  17. 〈原创〉诗如文学之筋骨,琴乃乐中之天籁
  18. java生成unix格式文件_Java Windows文本格式和Liunx/Unix文本格式转换
  19. 直流电压和电流数据记录器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  20. 感《明朝后期的中缅战争》

热门文章

  1. 前端新拟态UI风格按钮,button按钮点击凹陷效果
  2. captcha验证码入门
  3. linux 安装oracle
  4. 国产上新!芯驰D9多核Cortex-A55核心板,国产车规级平台
  5. php 消息对话框弹出,php弹窗代码_php弹出消息提示框的二种方法
  6. 【车载开发系列】嵌入式车载开发专业词汇
  7. 全球与中国陶瓷喷墨过滤器市场现状及未来发展趋势2022-2028
  8. 生成对抗网络(一)GAN
  9. 用xnview批处理图片
  10. mybatis快速入门