先观察如下代码和运行情况:

按照控制台提示,输入 value 的值之后,本该能够按照提示继续输入 choice 的值。但是你会发现程序直接跳过了 choice 的输入。而且 choice 原本的值是 'a',最后变成了换行符(即'n')。

造成这种现象的原因是 C 语言的输入缓冲区的机制。

什么是 C 语言的输入缓冲区呢?

输入分为两种,一种称为无缓冲输入(或直接输入),即你每输入一个字符,程序就读一个字符,并可立即使用这个字符;另一种称为缓冲输入,即将你一次性输入的所有字符先收集并存到缓冲区(buffer)里,在你按下 Enter 键之后将这些字符作为一个“块”全部给到程序。

为什么要使用缓冲区呢?

首先,把若干个字符作为一个块来传输比逐个发送字符更节约时间。其次,如果用户打错了字符,可以在输入区域修正,确认无误后按 Enter 键传入正确的输入。如果你使用的是无缓冲输入,那么一旦你打错字,这个错字符立刻就被传入到程序里了,这个时候想要改正就比较麻烦了。无缓冲输入一般在交互性强的程序里使用(比如实时游戏)。

缓冲分为两类:完全缓冲 I/O 和行缓冲 I/O。完全缓冲指的是当输入区被填满时才能刷新缓冲区,通常出现在文件输入中;行缓冲指的是在出现换行符时刷新缓冲区。键盘输入通常是行缓冲输入,所以在按下 Enter 键后才刷新缓冲区。

回到之前的问题。当我们输入 value 的值之后,我们敲了一下 Enter,将 value 的值传入,同时刷新了缓冲区。这里注意一个问题:scanf() 里的参数是 %d,要求读取 int 型变量。那么 scanf() 会跳过所有的空白字符,直到遇到第一个非空白字符。如果下一个字符是数字,那么 scanf() 继续读取;如果下一个字符不是数字,则 scanf() 认为读到了末尾,于是刷新缓存区,并将非数字字符放回缓存区

紧接着我们就要输入 choice 的值,这时在缓冲里的是残留的 Enter,也即换行符。那么 choice 作为一个字符类型的变量,接收到了残留在缓冲区里的 Enter,于是程序自动结束。

因此,如果要让 choice 读到我们输入的正确数据,我们必须要在输入 choice 之前把缓冲区清空

清空缓冲区的方法有如下三种:

  1. 使用 stdlib.h 提供的 fflush() 函数。那么原先的代码可以改成如下形式:

fflush() 不在 C/C++ 标准里,比如 Linux 下的 GCC 就不支持这个函数,因此这个方法的可移植性较差,不推荐使用这个方法

2. 使用 while((choice = getchar()) != 'n' && choice != EOF); 语句。这个方法的原理是循环地将缓冲区剩余的字符赋给 choice,直到将缓冲区里的换行符赋给了 choice 或者 choice = EOF 的时候,则跳出循环。此时缓冲区里没有任何字符。然后即可继续输入。

这个方法的优点是可移植性强,在任何平台上都能过编译。因为只用到了 C 语言的 while 循环。一般推荐使用这个方法。

原先的代码改成如下形式:

3. 使用 stdio.h 提供的 setbuf() 函数关闭缓冲区。

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

  1. c语言遍历文件内容_C语言学习第28篇---动态内存分配剖析

    为什么C语言要动态分配内存的意义? 1.C语言中的一切操作都是基于内存的 2.变量和数组都是内存的别名 ---内存分配由编译器在编译期间决定的 ---定义数组的时候必须指定数组长度 ---数组长度是在 ...

  2. go 清空文件内容_回收站清空了怎么恢复?恢复回收站以前的文件

    获取专业数据恢复软件: 专注硬盘U盘误删文件数据恢复软件免费下载​dl-next.aunbox.cn 回收站清空了怎么恢复?很多时候为了保障电脑有足够的存储空间,我们会把不需要的电脑文件删除,这些文件 ...

  3. c语言遍历文件内容_C/C++编程笔记:C语言开发电脑益智游戏【扫雷】(源代码分享)...

    咱们先和大家说好,本次C语言开发的扫雷游戏是通过Easy X实现的,但是很多和我一样的新手,一开始不知道Easy X是什么,到时源码拿过去写之后,运行报错.Easy X是很多和我一样的新手在学习的时候 ...

  4. go 清空文件内容_回收站清空的文件怎么恢复?值得收藏的恢复方法!

    回收站清空的文件怎么恢复?我想这个问题一直困扰着大家吧,按理说本来回收站是给了我们一个后悔的机会,不像手机里面删除的数据就直接没了,但是对于这个后悔药,有的小伙伴并没有好好利用起来,有些人会直接按&q ...

  5. 不删除文件,清空文件内容命令

    不删除文件,清空文件内容命令 在某些时候,需要清空文件内容,而不删除文件.比喻有些日志文件(log.txt):在linux下的命令为:true >log.txt 测试结果: touch  log ...

  6. linux清空文件内容

    应用场景: 当tomcat运行时,tomcat的日志文件会被tomcat进程锁定,强制删除是会失败的.如果想要立即清空文件内容,可以使用如下几种方式. (1)使用空流覆盖文件,完成一次写入操作 #最简 ...

  7. Linux脚本之定时清空文件内容

    Linux脚本之定时清空文件内容 一.脚本要求 二.脚本内容 三.运行脚本 一.脚本要求 1.要求创建名为rm_file.sh的脚本 2.要求在/home/tmp/下各以人名命名的临时目录,每天0点定 ...

  8. linux 清空文件内容命令

    清空文件内容命令 $ echo "" >log.log > 是重写,覆盖式 >>是尾部追加 转载于:https://www.cnblogs.com/davi ...

  9. Linux清空文件内容的三种方法

    Linux清空文件内容的三种方法 测试文件:a.txt 第一种: $> a.txt 第二种: $echo "" > a.txt 第三种: $cat /dev/null ...

最新文章

  1. ACMNO.8输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。 输入 一行字符 输出 统计值 样例输入 aklsjflj123 sadf918u324 asdf91u32
  2. dba mysql命令_Mysql常用DBA命令
  3. ubuntu sublime字体设置
  4. 不悲观-不emo-永远保持正能量——21年末,去掉所有的不开心
  5. CentOS 6.5系统安装配置LAMP(Apache+PHP5+MySQL)服务器环境
  6. Qt学习之路(60): 创建shared library
  7. 程序员和美工是否可共存?
  8. 批量创建邮箱通讯组及向通讯组批量添加成员
  9. python 读取元组对的key_Python基本认识基本类型
  10. 数据绑定(九)Binding的数据校验
  11. springboot格式化时间
  12. 我给一个团队新成员的信
  13. 神经网络与深度学习pdf下载
  14. html的单元格加线,html表格单元格添加斜下框线的方法
  15. Ubuntu16.04 下安装运行 rovio-slam
  16. <PrivateImplementationDetails>.ComputeStringHash 错误解决办法
  17. 超级表格有没有协作人数限制?
  18. 域名是什么?怎样注册一个域名?
  19. JavaSE详细总结——万字纯手码
  20. vue组件内容不显示

热门文章

  1. 原子性、有序性和可见性解释
  2. android全方位性能优化方法
  3. linux安装系统ftp服务器配置,linux系统搭建ftp服务器的配置方 - 电子发烧友网
  4. rpm安装mysql
  5. 边缘设备上的实时AI人员检测:入门
  6. php多个逻辑如何分为多个逻辑块,php 项目如何分层
  7. python2没有pip命令_解决Windows下python和pip命令无法使用的问题
  8. 国产plc做modbus从站_Modbus-RTU通信
  9. 编程猫海龟编辑器python_海龟编辑器下载
  10. sprintf函数打印数据不对_printf的归宿-数据打印到哪儿了