C/C++ 四种清空输入缓冲区的方法

关于清除缓冲区的问题 在自己写图书管理系统项目的时候,遇到了挺多问题的。这个问题比较严重,就是在自己循环增加图书的时候用char c=getchar() 取得是缓冲区字符,因此不知道缓冲区是否还会存在数据。所以有一下几种方法; 所谓缓冲区,就是字符由键盘输入的时候,先进缓冲区,不会直接进入硬盘,这样相对来说能提高效率,scanf和cin都是从缓冲区去获取数据的。 以下例子是关于缓冲区的例子: #incl... 阅读详情
AI摘要

本文详细介绍了C和C++中四种有效清理输入缓冲区的方法,包括fflush(stdin)、cin.sync()、cin.ignore()及循环读取getchar(),特别强调了cin.ignore()在不同情况下的应用技巧及其与Windows.h头文件的冲突解决方案。

一、

fflush(stdin);

C语言:清空输入缓冲区的所有内容,在VS中没有效果


二、

cin.sync();

C++:清除输入缓冲区的所有内容,在VS中没有效果


三、

cin.ignore(std::numeric_limits< streamsize >::max(), ‘\n’);

C++:清除输入缓冲区的所有内容,直到遇到回车符为止, 各种编译器都有效

简要说明:
cin.ignore(count, c);
从输入流中提取并丢弃字符,直到遇到下列三种情况
1.提取的字符达到了参数count指定的数量
2.在输入序列中遇到文件结束(EOF)
3.输入序列中的下一个字符为参数c指定的字符(这个字符会被提取并丢弃)
可以写成: cin.ignore(10, ‘\n’);
提取输入缓冲区中的数据,直到遇到回车符,当读取的数据到达十个时,就会停止提取,不会继续提取到回车符。(限制提取十个数据)

count常常取:
std::numeric_limits< std::streamsize >::max() 相当于IO流的最大字符个数

常见用法:(把标准输入缓冲区cin的所有数据都清空)
cin.ignore(std::numeric_limits< streamsize >::max(), ‘\n’);

注意:
1.cin.ignore(std::numeric_limits< streamsize >::max(), ‘\n’);在有包含头文件#include <Windows.h>时是无法使用的;

2.因为该头文件已经包含了宏定义min 和 max,再使用就会优先调用头文件#include<Windows.h>中的宏定义,就会起冲突,从而导致报错;

3.如果有要求要包含头文件#include <Windows.h>,而且还要使用cin.ignore(std::numeric_limits< streamsize >::max(), ‘\n’);的话,需要在包含头文件#include<Windows.h>之前加上一句#define NOMINMAX,限定头文件#include<Window.h>中的宏定义min 和 max 就行了;

4.或者直接删去头文件#include<Windows.h>也可以解决问题

5》》》》》》》》》》》》》》》》》》》》》》》》》》》》
还有一种解决方法:
cin.ignore((std::numeric_limits< streamsize >::max)(), ‘\n’);
在回车符前面加上一个括号就可以了,因为不加()的话,max 就和系统中已经有的,预定义的max宏函数混淆了。

附上报错截图:
在这里插入图片描述


四、

char c;
while ((c = getchar()) != ‘\n’);

C/C++:循环读取输入缓冲区的数据,直到遇到回车符为止,效果等效于:清空输入缓冲区的所有数据,直到遇到回车符为止。 在各种编译器中有效。

C++开发者必看:ostringstream清空缓存的正确姿势(别再只用clear了) 本文针对C++开发者在处理ostringstream时常见的误区,详细解释了clear()函数仅重置流状态而非清空缓冲区内容的本质。文章指出,正确清空ostringstream缓存的方法是使用str(""),并结合底层stringbuf机制和内存管理进行深入分析,提供了循环重用、类成员变量等不同场景下的最佳实践,帮助开发者避免内存错误和逻辑缺陷。 阅读详情

相关推荐

C/C++输入缓冲区换行符残留问题:原理、解决方案与最佳实践

在C/C++编程中,输入输出流与缓冲区的交互机制是理解程序I/O行为的基础。标准输入输出通过缓冲区作为中介层,当用户按下回车键时,换行符\n会随输入数据一同进入缓冲区。不同输入函数对缓冲区的处理方式存在差异:格式化输入函数会跳过前导空白字符但将终止读取的\n留在缓冲区,而行输入函数则会读取并消耗\n。这种机制差异导致混合使用不同输入函数时,残留的\n会干扰后续读取操作,引发程序逻辑错误。从工程实践角度,正确处理缓冲区残留问题对构建健壮的控制台应用程序至关重要。本文深入解析了输入缓冲区的工作原理,并提供了多种

weixin_33428613的博客 298

在C ++中清除输入缓冲区

问题引入 用过C++的都明白,在运用输入过程中会出现不经意间意外输入错误的情况,导致之后的输入无效,C++内部会继续使用之前的意外输入,使得程序运行错误。 输入缓冲区 所有从键盘输入的数据,不管是字符还是数字,都是先存储在内存中的一个缓冲区里面,叫做键盘缓冲区,简称输入缓冲区或者输入流。 当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中读取数据。这种缓冲机制规定,只...

qq_43393963的博客 4281

c++标准I/O输出流

/* 标准输出流对象cout cout.flush() cout.put() cout.write() cout.width() cout.fill() cout.setf(标记) / / manipulator(操作符、控制符) flush endl oct dec hex setbase setw setfill setprecision … */ 标准输出流常见api编程案例 #include “iostream” using namespace std; #include void main81(

希望我的博客,能帮上你解决学习中工作中所遇到的问题 611

C/C++清理输入缓冲区中的内容

1.清理输入缓冲区最后剩下的单个回车符:方法一:用getchar函数读取回车符,方法二:用scanf("%*c")读取掉回车符,方法三:用scanf(" %c",&ch)。 2.清理输入缓冲区中剩下的所有内容:方法一:用getchar函数结合循环语句,方法二:用scanf("%*[^\n]"):

weixin_44049823的博客 1万+

基于单片机负载控制的无人机电气设备监测系统设计

为深入分析无人机电气设备的电子负载性能,实现对传输电子量的合理性监管与控制,设计基于单片机负载控制的无人机电气设备监测系统;利用电气信号发生电路,构建负载网络控制器与以太网模块运行所需的电气设备负载环境,借助PCB监控板建立PLC扩展负载模块与核心监控主机之间的物理连接关系,实现无人机电气设备监测系统的硬件执行环境搭建;在此基础上,通过STM32型单片机移植协议,确定无人机电气设备通信主机的现有组态形式,联合已设定的监控任务有线级条件,实现监测系统的软件执行环境搭建,完成基于单片机负载控制的无人机电气设备监

weixin_45905610的博客 1300

ANSYS APDL实战:手把手教你搞定电磁-热耦合分析(附完整命令流)

本文通过一个工业感应加热线圈的实战案例,手把手教你使用ANSYS APDL完成电磁-热耦合分析。内容涵盖从几何建模、材料定义、网格划分到加载求解及后处理的完整流程,重点讲解了使用PLANE13单元进行双向耦合场分析的方法与命令流调试技巧,助力工程师快速掌握这一核心仿真能力。

weixin_29284201的博客 419

清理cin输入缓冲区_C/C++ 四种清空输入缓冲区的方法

C/C++ 四种清空输入缓冲区的方法C/C++ 四种清空输入缓冲区的方法一、fflush(stdin);C语言:清空输入缓冲区的所有内容,在VS中没有效果二、cin.sync();C++:清除输入缓冲区的所有内容,在VS中没有效果三、cin.ignore(std::numeric_limits< streamsize >::max(), ‘\n’);C++:清除输入缓冲区的所有内容,直...

weixin_35806027的博客 5198

如何安装最新版本的 SAP ABAP Development Tool ( ADT ) ,并且能够随时升级

下载链接:https://tools.hana.ondemand.com/#abap 首先安装 Eclipse IDE for Java Developers 找到适合自己操作系统的 Eclipse 安装包: 安装之后,打开Eclipse: Install -> New Softwares, 输入 url:https://tools.hana.ondemand.com/latest 全部安装: 安装完毕之后,新建一个 ABAP Project,本地 SAP GUI 里添加的系统,会自动带出来:

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4277

C/C++清空控制台输入缓冲区

这里使用了fgets函数来接收控制台输入,但是输入昵称之后立马就发送了一个消息,原因就是scanf输入之后并没有清空输入缓冲区,所以输入完回车之后立马就触发了fgets函数,为了解决这个问题我在scanf输入之后,发送线程开启之前清空了输入缓冲区。所以这里注意到了这个问题然后这里总结了一些C/C++中清空输入缓冲区的方法。

weixin_73548574的博客 1400

【Envi遥感图像处理】022:envi时空分析工具的使用

本文介绍了ENVI软件中的时空分析工具应用,以美国拉斯维加斯1975-2014年的9期Landsat数据为例。主要内容包括:1)时空分析概念,即对空间相关时间序列数据的建模分析;2)构建时序数据流程,通过添加栅格、时间排序等步骤生成.series格式时序文件;3)时序数据查看方法,包括动画播放、添加注记及保存视频;4)多源数据统一处理工具,解决坐标系、空间范围不一致问题。该工具可用于冰川变化、植被覆盖等时空变化研究。

智慧空间实验室 269

华为OD机试双机位C卷:采购订单 (Py/Java/C/C++/Js/Go)

华为OD机试双机位C卷 采购订单,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,并提供在线OJ模拟做题。华为OD机试真题【采购订单】

qq_45776114的博客 3534

C++cin详解及清空输入缓冲区

输入原理: 程序的输入都有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin对象直接从输入缓冲区中取数据。正因为cin对象是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin对象会直接取得这些残留数据而不会请求键盘输入 一. cin>> 该操作符是根据后面变量的类型读取数据。 输入结束条件 :遇到E

selina8921的博客 5万+

影楼精修-肤色统一算法解析

本文介绍了影楼精修中肤色统一算法的实现方案,并以像素蛋糕软件为例进行详细分析。肤色统一旨在通过调整人像照片中皮肤区域的颜色,使其看起来更加均匀一致。像素蛋糕软件提供了AI肤色统一和传统肤色统一两种功能,分别适用于不同需求。传统肤色统一算法通过皮肤分割、人脸检测、亮度统一和颜色统一等步骤,实现了对皮肤区域的精细调整。文章还提供了亮度统一的核心代码,并对比了传统算法与AI算法的效果,指出AI算法在自然度和亮度矫正方面表现更优。整体而言,本文为影楼精修中的肤色统一提供了实用的技术参考。

Trent1985的专栏 2061

c/c++如何清空流

今天看程序时,遇到了fflush()这个函数,以前从没有接触过,google了一下,发现这个篇文章介绍的很详细,贴上来和大家共享一下。 Antigloss 最后修改于 2006-11-25 1.       为什么 fflush(stdin) 是错的 首先请看以下程序:                    #include  int

CSU305的专栏 6825

C#与欧姆龙PLC 通信——Fins Tcp协议

该调试助手专门为了帮助大家学习以及测试Fins-Tcp通信,下面进行详细介绍。

qq_34059233的博客 2080

Qt/C++ 音视频开发: 共享解码线程/重复利用解码/极低CPU占用/画面同步/进度同步

通过共享解码线程和重复利用解码技术,可以显著降低CPU占用,提高多媒体应用的性能。同时,画面和进度同步技术保证了视频播放过程的平滑体验。

走向CTO的路上... 985

C语言清空输入缓冲区

C语言编程 - 清空键盘输入缓冲区 清空键盘缓冲区很多种方法,如用fflush(stdin);rewind(stdin);等,但是在linux这些都不起作用,还得我今天试了半天都没成功,上网搜了一下发现setbuf(stdin, NULL);就能直接清空键盘缓冲区了。 以下几个实例: Sample one #include <stdio.h> intmain() { ...

wenson的博客 2368

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

在 C/C++ 中清除输入缓冲区

在 C/C++ 中清除输入缓冲区

Serven的博客 2万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

c语言清空scanf缓存,C语言清空输入缓冲区

来源:http://blog.youkuaiyun.com/guanyasu/article/details/53153705https://zhidao.baidu.com/question/5241738.htmlC语言中如何清空输入输出缓冲区上述描述似乎能够解决问题了,但是,fflush( )并不是标准C语言库函数,只是部分编译器自己实现的函数,是对标准C的扩展。先来看一段代码:#include int...

weixin_35804761的博客 3974

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

在C / C ++中清除输入缓冲区

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,优快云社区专家,特邀编辑,畅销书作者,已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。优快云视频网址:http://edu.youkuaiyun.com/lecturer/144      什么是缓冲区? 临时存储区称为缓冲区,所有标准输入和输出设备都包含输入和输出缓冲器。在标准C / C +

海洋个人博客 1万+

清除cin输入缓冲区,以及system(“pause“)、system(“cls“)用法

system(“pause”)、system(“cls”) system(“pause”):简单来说就是暂停的意思,等待接收信号,才会重新运行 system就是从程序中调用系统命令zhi和daoshell命令,“pause”这个系统命令的功能很简单,就是在命令行上输出一行类似于“Press any key to exit”或“请按任意键继续…”的字,等待用户按一个键,然后返回。 system(“cls”):请出输出屏幕上的字符数据。 清除C/C++(cin)输入缓冲区的方法 1、fflush(std

qq_40428783的博客 1万+

c语言清空文件内容_C 语言清空输入缓冲区的几个手段

先观察如下代码和运行情况:按照控制台提示,输入 value 的值之后,本该能够按照提示继续输入 choice 的值。但是你会发现程序直接跳过了 choice 的输入。而且 choice 原本的值是 'a',最后变成了换行符(即'n')。造成这种现象的原因是 C 语言的输入缓冲区的机制。什么是 C 语言的输入缓冲区呢?输入分为两种,一种称为无缓冲输入(或直接输入),即你每输入一个字符,程序就读一个字...

weixin_36246029的博客 1911

c++ 清空控制台_C 语言清空输入缓冲区的几个手段

先观察如下代码和运行情况:按照控制台提示,输入 value 的值之后,本该能够按照提示继续输入 choice 的值。但是你会发现程序直接跳过了 choice 的输入。而且 choice 原本的值是 'a',最后变成了换行符(即'n')。造成这种现象的原因是 C 语言的输入缓冲区的机制。什么是 C 语言的输入缓冲区呢?输入分为两种,一种称为无缓冲输入(或直接输入),即你每输入一个字符,程序就读一个字...

weixin_39830175的博客 1281

vs2017下清空输入缓冲区(c/c++)

在网上找了挺久好像都只说了什么fflush,rewind,cin的什么什么函数,但貌似都没有能够真正的在vs2017下清空输入缓冲区的。 隐约记得以前我已经试过清空了,但是又忘记了是什么,翻翻以前的代码才找到。 ...

qq_43118700的博客 2498

C语言清空输入缓冲区,以及fflush(stdin)的使用误区和解决方法

为什么 fflush(stdin) 是错的? 首先请看以下程序: #include <stdio.h> int main( void ) { int i; while (1) { fputs("Please input an integer: ", stdout); scanf("%d", &i); printf("%d\n", i)...

weixin_42282031的博客 1689
上一篇: C++ 文件流的定位
下一篇: C++ 文件流详解
cpp_learners
博客等级 码龄7年 1526粉丝 274原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值