键盘输入流的缓冲效应 I/O流 缓冲I/O

2023-11-17

引子

有时候,你会发现,你的程序老是读不进某个值,但是反反复复看代码,又感觉自己代码真的没有问题。

比如说下面这个代码:

#include"stdio.h"
int main()
{
	int num;
	char ch;
	scanf("%d",&num);
	scanf("%c",&ch);
	printf("%d%c",num,ch);
}

当你是以按回车表示结束输入完一个值时,你会发现,你只能输入一个值,然后程序就结束了。

你要改成这样:

#include"stdio.h"
int main()
{
	int num;
	char ch;
	scanf("%d\n",&num);
	scanf("%c",&ch);
	printf("%d%c",num,ch);
}

或者是这样才行:

#include"stdio.h"
int main()
{
	int num;
	char ch;
	scanf("%d",&num);
	getchar();
	scanf("%c",&ch);
	printf("%d%c",num,ch);
}

当输入一个整型数据或者是浮点型数据时,残余的空格或者是回车会影响后面字符的读入。

为什么会这样?

原因是因为键盘输入流的缓冲效应。

我们先来讲一下I/O流。

I/O流

所谓流,简单来说,就像是一个接一个的数据按先进先出的顺序排成的数据流。基于字符的输入输出都是以流的方式进行的,像从键盘敲入的ASCII字符。每输入一个新字符,该字符就会被添加到流的尾部。

缓冲区

键盘输入的数据不会立即存储到相应变量中,而是先放到系统的一个缓冲区里面,每输入一个新数据,该新来的就会被放到输入流尾部,直到输入回车符作为一种确认结束输入,缓冲区里面的数据会被读入到相应变量的存储位置,之后系统会清空缓冲区。

所以在第一个程序中,在输入整型数据后,如果输入空格或者是回车会被放到缓冲区里面,那么字符型变量就会从缓冲区中读取空格或者是回车,然后程序结束。

所以一般需要用getchar()去吞掉一个回车,在C语言中,有时候也可以通过在前一个控制输入格式末尾加\n解决,但有时候只能用getchar()解决。

缓冲区的好处

正因为键盘输入的数据不会立即存储到相应变量中,而是先放到缓冲区中,因此,当输入错误字符想要删改的时候,可以通过退格键(backspace)或删除键(delete)删掉重新输入。

受系统影响

在Windows下,下面这个程序,会先输出a,过5秒后再输出b。

#include"stdio.h"
#include"unistd.h"
int main()
{
	putchar('a');
	sleep(5);
	putchar('b');
	putchar('\n');
}

其中sleep函数(要包含头文件unistd.h)是暂停程序执行,暂停时间由sleep参数决定,单位为秒。

但是在Linus下,a并不会立即输出,而是等过了五秒后和b一起输出。这是因为只有字符'\n'才能清空输出缓冲区,然后将字符序列添加到输出流中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

键盘输入流的缓冲效应 I/O流 缓冲I/O 的相关文章

随机推荐

  • STM32 PWM捕获方式:两种思想

    一 利用系统自带PWM捕获 1 代码 初始化 c include capture h include stm32f10x h void Capture Init PA7 gt TIM3 CH2 GPIO InitTypeDef GPIO I
  • springboot性能优化

    SpringBoot性能调优有三种方案 SpringBoot 是一个快速开发框架 能够快速的整合第三方框架 简化XML配置 全部采用注解形式 内置Tomcat容器 帮助开发者能够实现快速开发 SpringBoot的Web组件 默认集成的是S
  • 软件测试:白盒测试

    一 定义 白盒测试又称结构测试 透明盒测试 逻辑驱动测试或基于代码的测试 白盒测试是一种测试用例设计方法 盒子指的是被测试的软件 白盒指的是盒子是可视的 白盒 法全面了解程序内部逻辑结构 对所有逻辑路径进行测试 白盒 法是穷举路径测试 在使
  • webpack5搭建vue环境

    webpack5搭建vue环境 0 前言 安装 webpack webpack cli 开始我是全局安装进行测试 后期项目中最好用局部安装 不同项目使用的版本不同 熟悉 npm基本命令确保npm可以使用 1 webpack概念 中文官网 h
  • SQL语句的MINUS,INTERSECT和UNION ALL

    SQL语句中的三个关键字 MINUS 减去 INTERSECT 交集 和UNION ALL 并集 关于集合的概念 中学都应该学过 就不多说了 这三个关键字主要是对数据库的查询结果进行操作 正如其中文含义一样 两个查询 MINUS是从第一个查
  • vue实现下载文件和图片功能

    vue实现图片或文件下载功能 今天一个需求就是实现图片下载功能 刚开始以为很简单没有什么逻辑可写 就以为调用后端接口就可以了 调用之后发现有问 题 看来还是没有想象的那么简单 1 要自己创建一个a标签 以下就是下载功能的实现 这里是调用接口
  • 2.4 HTTP请求方法

    在客户端向服务器端发送请求时 需要确定使用的请求方法 请求方法表明对URL指定资源的操作方式 服务器会根据不同的请求方法进行不同的响应 在HTTP 1 1中 共定义了8种请求方法 具体如下 GET 请求指定的内容并返回 POST 向指定资源
  • 分布式缓存的切片模式-hash一致性切片

    文章目录 一 为什么使用缓存 二 为什么使用分布式 三 使用什么模式 四 常规切片模式的弊端 五 更加犀利的切片模式 hash一致性切片 六 不完美的数据倾斜以及解决方案 6 1 数据倾斜 6 2 解决办法 一 为什么使用缓存 当前 我们通
  • 基于stm32的keil调试

    目录 基于stm32的keil调试 前言 实验目的 问题 debug 定位问题 解决 总结 基于stm32的keil调试 本文目标 基于stm32的keil调试 按照本文的描述 应该可以跑通实验并举一反三 先决条件 装有编译和集成的开发环境
  • 06_个人注释版本(01版本)GTK播放器__基于Linux系统下的mplayer播放器

    include
  • 计算机视觉结合深度学习项目-智能停车场空车位实时识别

    欢迎来到本博客 本次博客内容将继续讲解关于OpenCV的相关知识 作者简介 目前计算机研究生在读 主要研究方向是人工智能和群智能算法方向 目前熟悉python网页爬虫 机器学习 计算机视觉 OpenCV 群智能算法 然后正在学习深度学习的相
  • Android框架源码解析之(五)Retrofit

    源码地址 https github com square retrofit Retrofit源码结构 可以看出Retrofit是使用idea maven依赖编写的Java工程 并不是一个Android 工程 Retrofit的简单使用 1
  • 学习docker之路(三)

    目录 一 docker容器内操作 二 网络 一 docker容器内操作 1 将容器导出为归档 docker export 容器名称 o 归档包名称 root localhost docker export 05 o mynginx v2 t
  • leetcode_165. Compare Version Numbers 比较版本大小

    题目 Compare two version numbers version1 and version2 If version1 gt version2 return 1 if version1 lt version2 return 1 o
  • git简单使用与安装(小白01)(还看不懂我下个版本给图片)

    一 1 下载git 在官网上下载 下载成功后 闭着眼睛狂点下一步 然后就成功了 嘿嘿 二 1 随便创建一个新的文件夹 打开文件夹点这里 下图 然后输入cmd 然后在按回车 cmd中输入 git init 生成git文件 该文件是隐藏状态 2
  • redis06_ redis的订阅发布模式(redis做MQ中间件)、持久化(rdb,aof)、事务

    一 redis订阅发布模式 1 1 简介 redis 可以做消息中间件 MQ message queue 通常通过订阅发布模式来实现 消息订阅发布模式 还可以基本数据类型Lists实现 点到点模式 可以使用lpush lpop 实现消息先进
  • linux中I/O流中的全缓冲、行缓冲和无缓冲,简明实例演示

    说到缓冲 缓存之类的术语 通常都会和执行效率联系到一起 在标准I O库中提供缓冲的主要目的就是减少系统函数read和write的调用 从而能够减少系统CPU时间 标准I O库的缓冲主要分为3种 全缓冲 行缓冲和不缓冲 笔者就3种缓冲写了一些
  • 时钟电路设计概述 - 数字电路设计

    时钟电路设计概述 数字电路设计 2010 09 10 阅 转 分享 本文一般性地讲解了数字电路设计中的 时钟电路设计 包括有源 晶振
  • Unity3D教程笔记——unity初始02

    史上最全Unity3D教程 哔哩哔哩 bilibilihttps www bilibili com video BV12s411g7gU p 11 vd source f38a8a7e90133354051c463eb03a3b4f 这里是
  • 键盘输入流的缓冲效应 I/O流 缓冲I/O

    引子 有时候 你会发现 你的程序老是读不进某个值 但是反反复复看代码 又感觉自己代码真的没有问题 比如说下面这个代码 include stdio h int main int num char ch scanf d num scanf c