一、缓冲区的作用

  • 一般缓冲区的作用是为了防止频繁的读写。

    • A:往缓冲区里写,这里会有一个写的等待时间,并不总是有数据需要写;
    • B: 从缓冲区里读,这里就有一个读间(没有数据或数据不全)的等待时间;

使用缓冲区可以减小程序输入时的等待,程序线程可以腾出CPU时间做其它的工作;


二、缓冲区的问题

缓冲区在提升了程序效率的同时,也带来了一些问题。
在项目的编写的工程中,很多时候并不需要用户的输入,这时如果用户输入,输入的信息就会被存入缓冲区中,当程序真的需要输入时,这些之前输入的信息,会被传入程序。造成程序获取错误信息,甚至是崩溃。


三、解决方案

1.使用fflush(stdin)

  • 优点:使用这种方法清除缓冲区,简单快捷,只需将这条语句放入程序的输入语句的前面。
  • 缺陷:但是这个方法有很大缺陷,因为在c语言得标准中没有明确规定这种用法,所以并不是所有的编译器都支持。
    • 如果编译器支持,那么清除缓冲区就很简单了。
    • 如果编译器不支持,它并不会报错,只是执行完这条语句后,缓冲区的内容依然存在。

2.getch()的连续获取

while(getchar()!='\n')continue;
  • 优点:使用这种方法进行缓冲区的清除,通用性好,任何系统和编译器都支持。
  • 缺陷:缓冲区清除的不彻底,这种缓冲区清除方法,依据判断获取字符为“换行符”来停止。
    • 如果缓冲区中有换行符,但不是最后一个字符,这时缓冲区中第一个换行符之前(包括换行符)被清掉,但是第一个换行符的后面字符不会被清掉。
    • 如果缓冲区中没有换行符,那么while会进入死循环,程序会停下来,这时只有按下回车键,程序才会向后运行,这样很影响用户体验。
    • 在无法判断是否需要清除缓冲区时,无法使用这个方法,因为这会导致程序无故停顿等待用户输入回车键

3.setbuf()

  • 原理:使stdin输入流由默认缓冲区转为无缓冲区。
  • 优点:使用这种方法清除缓冲区,简单快捷,只需将这条语句放入程序的输入语句的前面。
  • 缺陷:通用性不好,这种方法只适用于Windows的大部分编译器,linux和Windows的少量编译器使用时没有反应。

4.scanf(“%*[^\n]%*c”)

原理:%*〔^\n〕将逐个读取缓冲区中的’\n’字符之前的其它字符,%后面的*表示将读取的这些字符丢弃,前遇到’\n’字符时便停止读取操作,此时,缓冲区中尚有一个’\n’字符遗留,所以后面的%*c将读取并丢弃这个遗留的换行符,这里的星号和前面的星号作用相同。由于所有从键盘的输入都是以回车结束的,而回车会产生一个’\n’字符,所以将’\n’连同它之前的字符全部读取并丢弃之后,也就相当于清除了输入缓冲区。

  • 优点:使用这种方法进行缓冲区的清除,通用性好,任何系统和编译器都支持。
  • 缺陷:缓冲区清除的不彻底,这种缓冲区清除方法,依据判断获取字符为“换行符”来停止。
    • 在无法判断是否需要清除缓冲区时,无法使用这个方法,因为这会导致程序无故停顿等待用户输入回车键

5.判断键盘输入

while (_kbhit())
{getch();
}

kbhit()是一个C和C++函数,用于非阻塞地响应键盘输入事件。

这是一个我自己发现的一个清缓冲区方法:
* 使用kbhit()判断是否有键盘输入,即判断缓冲区内是否有内容。
* 如果缓冲区有内容,就使用getch()去获取,直到缓冲区内的所有输入都被清掉。
ps:使用这种方法,简单快捷,只需把这几行复制到需要的输入的代码之前,应对用户的各种诡异输入,都可以清除干净。同时它可以自动判断是否需要进行清除操作,避免了程序的意外停止。很好用!!!

清除缓冲区的几种方法相关推荐

  1. C语言清空输入缓冲区的N种方法对比

    C语言中有几个基本输入函数: //获取字符系列 int fgetc(FILE *stream); int getc(FILE *stream); int getchar(void); //获取行系列 ...

  2. php 清除缓存的操作,PHP清除缓存的几种方法

    这篇文章主要介绍了PHP清除缓存的几种方法总结的相关资料,希望通过本文大家能够掌握清除缓存的方法,需要的朋友可以参考下 PHP清除缓存的几种方法总结 现在开发的项目是用tp3.1版本的,在开发过程中我 ...

  3. [Web 前端] 018 css 清除浮动的四种方法

    清除浮动的四种方法 加 clear: ...(见例1) 父级上增加属性 overflow:hidden(见例2.1) 在最后一个子元素的后面加一个空的 div,给它一个样式属性 clear: both ...

  4. CSS清除浮动的四种方法

    CSS清除浮动的四种方法 第一种:使用div空标签法 第二种:父元素使用overflow: hidden 第三种:伪元素选择器:after 第四种:伪元素选择器:before + after 第一种: ...

  5. JS清除缓存的几种方法

    一.CSS和JS为什么带参数(形如.css?t=与.js?t=)怎样获取代码 css和js带参数(形如.css?t=与.js?t=) 使用参数有两种可能: 第一.脚本并不存在,而是服务端动态生成的,因 ...

  6. CSS的浮动及清除浮动的5种方法

    浮动是布局的时用到的一种技术,能够方便我们进行布局. 1.浮动的设置:css属性float:left/right/none 左浮动/右浮动/不浮动(默认) 2.浮动的原理:使当前元素脱离普通流,相当于 ...

  7. html中清除浮动的几种方式,清除浮动的几种方法-关于CSS清除浮动的几种方法

    CSS清除浮动的3种方法,参考: 方法1: #test{clear:both;} #test为浮动元素的下一个兄弟元素 方法2: #test{display:block;zoom:1;overflow ...

  8. CSS清除浮动的几种方法

    来源 | https://www.html.cn/web/css/19613.html 今天这篇文章给大家介绍一下CSS清除浮动的几种方法.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮 ...

  9. Css 清除浮动的几种方法

    Css清除浮动的几种方法 1. 为什么添加浮动 2. 为什么清除浮动 3. 清除浮动 1) 额外标签法 2) 利用 Css 的 overflow; 3) after伪元素清除浮动 4)after.be ...

最新文章

  1. Java异常信息处理
  2. Windows 应用容器化
  3. 【论文阅读笔记】Beamforming Optimization for Wireless Network Aided by IRS with Discrete Phase Shifts
  4. 联想电脑如何关闭/开启windows自动更新
  5. adb push php,ADB指令合集-ADB指令如何执行刷Recovery,重启进Recovery,双Wipe和刷ROM手机刷机...
  6. Angular 简介
  7. 抖音 快手 皮皮虾 短视频一次解析
  8. shimano 型号详解 (zz)
  9. HTMLCSS的语法与使用
  10. osx 续航测试软件,苹果吹牛了吗?多款Macbook续航测试结果出炉
  11. 网络安全能力认证CCSC管理Ⅰ级认证
  12. linux的安卓源码编译提示版本不匹配,编译Android源码致命错误解决方案
  13. 水浴的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  14. python实现Excel中的数据透视表功能
  15. DS村村通工程(Prim算法)
  16. 转移到ios下载安卓_转移到iOS下载_转移到iOS怎么用_转移到iOS安卓版下载_转移到iOS app_易玩网...
  17. 2022.5.16-5.22 AI行业周刊(第98期):人生路上的打怪升级
  18. linux qt按键精灵,按键精灵QT抢夺脚本源码
  19. 财经365:2022巴菲特致股东的信最新解读
  20. Candence常用操作快捷键

热门文章

  1. 判断两个平面向量之间夹角是顺时针还是逆时针
  2. 雷军:只要不让公司翻船 你就能去做
  3. Cohort Analysis组群分析(1)
  4. vue 全景图 photo-sphere-viewer 实现
  5. 萌新带你开车上p站(二)
  6. 2021年中国面料行业现状分析:行业毛利率为11.9%[图]
  7. 乐园管理系统| 乐园小程序 | 数字化门店会员管理
  8. HDU - 1242
  9. 九城加设网游防沉迷 3千名玩家声称罢玩魔兽
  10. excel输入公式不计算结果