C++ cin清理缓冲区

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

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

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个参数则会忽略用户之后输入的全部信息(即使输对也没有反应)

示例代码如下:

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 国际许可协议进行许可,转载请注明出处

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏佳爷的后花媛

h文件和c文件的区别include本身只是一个简单的文件包含预处理命令,即为把include的后面文件放到这条命令这里,除此之外,没有其它的用处(至少我也样认为).

其实在H文件里写函数也无所谓,只是不符合习惯而已。只要按照以上的格式写,一个H文件添加多少次都无所谓,

2272
来自专栏上善若水

L004Linux和androidNDK之c代码风格及约定

1013
来自专栏拂晓风起

node.js模块化写法入门

1376
来自专栏程序员互动联盟

【编程基础第十三讲】代码如何写才最漂亮第二篇

存在问题: 好多小伙伴对编码的格式作用模糊,以为只要完成功能就行,其实这种观点是错误的,一定要重视代码规范,不然你哭的地都找不到。 如何实施: 良好的代码开发习...

2578
来自专栏王亚昌的专栏

程序的存储空间布局

栈 由编译器自动分配释放管理。局部变量及每次函数调用时返回地址、以及调用者的环境信息(例如某些机器寄存器)都存放在栈中。新被调用的函数在栈上为其自动和临时变量分...

1332
来自专栏技术小黑屋

你的Java代码对JIT编译友好么?

本文为 InfoQ 中文站特供稿件,首发地址为:你的Java代码对JIT编译友好么?。如需转载,请与 InfoQ 中文站联系。

2812
来自专栏java一日一条

java提高篇之异常(上)

在这个世界不可能存在完美的东西,不管完美的思维有多么缜密,细心,我们都不可能考虑所有的因素,这就是所谓的智者千虑必有一失。同样的道理,计算机的世界也是不完美的,...

982
来自专栏码代码的陈同学

Java基础之SPI机制

在前几天的译文 Java中的类加载器 中有部分关于ContextClassLoader的内容,涉及到SPI机制,本文将学习下相关知识。

1392
来自专栏FreeBuf

某工业组态软件整数溢出漏洞(CVE-2018-7471)分析

某公司工业组态软件存在整数溢出漏洞,该漏洞是由于stgopenstorage读取失败,返回的错误代码超出int在32位系统中的范围,攻击者可利用该漏洞执行任意代...

922
来自专栏java一日一条

Java异常有多慢?

实际上,真正要讨论的问题并不是,“相对‘那些不会发生错误的代码’来说,‘那些以异常形式上报的错误’会有多慢?”,因为你可能也认同“已接受的回答”。相反,真正的问...

3452

扫码关注云+社区

领取腾讯云代金券