scanf函数读取数据 清空缓冲区
scanf函数读取数据&清空缓冲区
- scanf 从输入缓冲区读取数据
- 数据的接收
- 数据存入缓冲区
- scanf 中%d读取数据
- scanf中%c读取数据
- 清空输入缓冲区
- 例子
- 用getchar()吸收回车
- 练习
scanf 从输入缓冲区读取数据
首先,要清楚的是,scanf在读取数据的时候,不是从键盘上读取,而是从
输入缓冲区读取数据
。
数据的接收
我们从键盘上输入的全部数据,不管是
数字
还是字母
还是空格
、回车
、Tab键
等,操作系统在接收时,都是将它们当成字符
来接收的。
比如,我们从键盘输入123,它表示的并不是数字123,而是字符'1'
、字符'2'
、字符'3'
。
数据存入缓冲区
在scanf中,从键盘中输入的一切数据,,不管是数字、字母、还是空格回车、Tab键等这些字符都会被当作数据存入
缓冲区
。
当按下回车键
时,scanf开始进入缓冲区读取数据,从前往后,依次取。
scanf 中%d读取数据
scanf中%d读取数据时,%d只识别“十进制整数”。
对于%d而言,空格、回车、Tab键都是区分数据与数据的分隔符
。
当scanf进入缓冲区读取数据的时候,如果%d遇到空格、回车、Tab键,那么它并不会采用,而是跳过取后面的数据,直到取到“十进制整数”
为止。
%d以
十进制整数形式
读取整数,scanf函数依然是每次读取一个字符
,而不是读取一整个数字,不会马上结束读取进行存储。
首先scanf函数从第一个输入开始检查,它会跳过所有空白字符,直到它发现一个数字或者符号(+或-),它便会保存该字符然后往下读取,如果接下来读取依然是数字,他就会不断地保存然后读取下一个字符直到遇见一个非数字字符,scanf函数认为这里是数字的结尾。
大家可以参考一个博主的这篇文章scanf函数到底怎么读取数字?
对于被跳过和取出的数据,系统会将它从缓冲区中释放掉
。
未被跳过或取出的数据,系统会将它一直放在缓冲区,直到下一个scanf来获取。
%d读取时中遇到字母,那么它不会跳过也不会取用,而是直接从缓冲区跳出
。
下面举个例子:#include <stdio.h> int main() { int a,b; scanf("%d", &a ); printf("a=%d ", a); scanf("%d",&b);printf("a=%d",b);return 0; }
当输入1(空格)2(回车)时,输出结果为
——————————————
a=1 b=2
——————————————
当输入1(Tab)2(回车)时,输出结果为
——————————————
a=1 b=2
——————————————
当输入(空格)(空格)1(空格)2(回车)时,输出结果为
——————————————
a=1 b=2
——————————————
当输入1(回车)2(回车)时,输出结果为
——————————————
1
a=1
2
a=2
——————————————
从输出结果可以看出来,不管是多种形式123的次性全部输入完,还是一个一个输入4,输出结果都是一样的。
原因在于从键盘上输入的数据都会被依次存入缓冲区,不管是数字还是字符都会被当作数据存进去。
我们可以全部将数据全部存入缓冲区后再一个一个用scanf取出,也可以到缓冲区存入一个数据scanf读取一个数据再到缓冲区存入一个数据再用scanf读取一个数据。
%d读取时中遇到
字母
,那么它不会跳过也不会取用,而是直接从缓冲区跳出
。
#include <stdio.h> int main() { int a,b; scanf("%d", &a ); printf("a=%d ", a); scanf("%d",&b);printf("a=%d",b);return 0; }
当我们输入
a(空格)1(回车)时,输出为
——————————————
a=-858993460 b=-858993460
——————————————
为什么会是这样的结果呢?
scanf中%d从缓冲区读取数据,从前往后依次取,先读到的字符是字母a,那么它不会跳过也不会取用
,而是直接从缓冲区跳出
,那么变量a没有值,即未被初始化,变量b也没有值,所以输出a=-858993460 b=-858993460
scanf中%c读取数据
对于%d,在缓冲区,空格,回车,Tab键都只是分隔符,不会被scanf当成数据取用,%d遇到它们就跳过,取下一个数据.但是如果是%c,那么空格,回车,Tab键都会被当成数据输出给scanf取用.
#include <stdio.h> int main() { char a,b; scanf("%c", &a ); printf("a=%c ", a); scanf("%c",&b);printf("a=%c",b);return 0; }
当我们输入1(空格)2()回车时,输出结果为
——————————————
a=1 b=
——————————————
这是因为,当我们输入结束时,输入缓冲区
的数据为1(空格)2(回车)
第一个scanf语句scanf从缓冲区读取一个字符,即字符1,将a=1 打印到屏幕上.
第二句scanf依然要从缓冲区读取数据,这时缓冲区还有数据,为(空格)2(回车),所以不需要我们再次从键盘上进行输入.scanf从缓冲区读取(空格)
,将此赋给变量b,b= 打印到屏幕上.此时缓冲区剩下了2(回车).
但我们希望的是,将字符2赋值给变量b,所以我们希望将(空格)清理掉,让scanf读取字符2.
清空输入缓冲区
例子
下面,先看一个例子
我们要实现用户输入密码,输入完之后,需要用户进行确认(Y/N)#include <stdio.h> int main() { char password[20]; printf("请输入密码:>"); scanf("%s", password); printf("请确认(Y/N):"); char ch=0;scanf("%c",&ch);if (ch == 'Y') printf("确认成功\n"); elseprintf("确认失败\n"); return 0; }
当我们运行程序,运行结果为
我们还没有输入Y或者N,为什么会直接弹出来确认失败
呢?
这是因为当我们输入密码> 123456(回车)时,scanf开始从输入缓冲区读取数据,第一个scanf语句,它只是读走了"123456",缓冲区剩下了(回车),对于第二个scanf语句,scanf依然从缓冲区读取数据,将留下缓冲区的(回车)读走.所以我们希望我们可以清理先
清理掉(回车)
,然后让用户自己输入Y/N.
用getchar()吸收回车
当我们要从输入流中取一个字符,但在之前使用过scanf,那么此时就必须要先用getchar()吸收回车。否则取到的将不是你想要的字符,而是scanf遗留在输入流中的回车。
我们对上面的程序进行修改:#include <stdio.h> int main() { char password[20]; printf("请输入密码:>"); scanf("%s", password); getchar(); //(1)printf("请确认(Y/N):"); char ch=getchar(); //(2)if (ch == 'Y') printf("确认成功\n"); elseprintf("确认失败\n"); return 0; }
对于语句(1),我们用getchar()
吸收scanf在缓冲区留下的回车
,简单,方便,都不需要将从缓冲区读到的回车赋值给一个字符变量.
对于语句(2),用getchar()
从缓冲区读取一个字符
,将此赋值给字符变量ch.
修改后的结果为:
练习
题目一
题目描述
描述
KiKi想完成字母大小写转换,有一个字符,判断它是否为大写字母,如果是,将它转换成小写字母;反之则转换为大写字母。
输入描述:
多组输入,每一行输入一个字母。
输出描述:
针对每组输入,输出单独占一行,输出字母的对应形式。
代码实现(方法一)-----用scanf获取字符#include <stdio.h> int main() {char ch;while(scanf("%c",&ch) != EOF){getchar();//吸收回车if (ch>='a' && ch<='z')ch=ch-32;else if(ch>='A' && ch<='Z')ch =ch+32; printf("%c\n",ch);}return 0; }
代码实现(方法二)----用getchar()获取字符
#include <stdio.h> int main() {char ch;while((ch=getchar())!=EOF){getchar();//吸收回车if (ch>='a' && ch<='z')ch=ch-32;else if(ch>='A' && ch<='Z')ch =ch+32; printf("%c\n",ch);}return 0; }
代码实现(方法三)—使用库函数
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> #include<ctype.h> //有库函数可以判断大写字母 -isupper //有库函数可以判断小写字母 -islower //大写转小写 -tolower //小写转大写 -toupper int main() { char ch = 0; while(scanf("%c", &ch) == 1) { if (islower(ch)) printf("%c\n",toupper(ch)); else if (isupper(ch)) printf("%c\n", tolower(ch));} return 0; }
题目二
题目描述
描述
KiKi想判断输入的字符是不是字母,请帮他编程实现。
输入描述:
多组输入,每一行输入一个字符。
输出描述:
针对每组输入,输出单独占一行,判断输入字符是否为字母,输出内容详见输出样例。#include<stdio.h> int main() {char a;while((a=getchar())!=EOF){getchar();//吸收回车if(('a'<=a&&a<='z')||('A'<=a&&a<='Z')){printf("%c is an alphabet.\n",a);}else{printf("%c is not an alphabet.\n",a);}} }
当然这个代码也可以修改一下,不吸收回车
#include<stdio.h> int main() {char a;while((a=getchar())!=EOF){if(('a'<=a&&a<='z')||('A'<=a&&a<='Z')){printf("%c is an alphabet.\n",a);}else if{printf("%c is not an alphabet.\n",a);}} }
用 if 和 else if,这样我们没有处理的回车,也不会满足其中的任何一个条件,而执行语句.
同时,也可以利用库函数:#include <stdio.h> #include <ctype.h> int main() {char a;while ((a = getchar()) != EOF){getchar();//吸收回车if (isupper(a) > 0 || islower(a) > 0){printf("%c is an alphabet.\n", a);}else{printf("%c is not an alphabet.\n", a);}}return 0; }
相关文章:

scanf函数读取数据 清空缓冲区
scanf函数读取数据&清空缓冲区 scanf 从输入缓冲区读取数据数据的接收数据存入缓冲区scanf 中%d读取数据scanf中%c读取数据 清空输入缓冲区例子用getchar()吸收回车练习 scanf 从输入缓冲区读取数据 首先,要清楚的是,scanf在读取数据的时候ÿ…...

js 文件常用转换
获取上传文件的arrayBuffer:var u8arr await file.arrayBuffer() 通过arrayBuffer转换成Buffer:Buffer.from(u8arr) 1. Blob、File → Base64 function fileToDataURL(file) {let reader new FileReader();reader.readAsDataURL(file);reader.onload…...

基于Open3D的点云处理15-特征点
Intrinsic shape signatures (ISS) 参考 ISS关键点: 基本原理是避免在沿主要方向表现出类似分布的点上检测关键点,在这些点上无法建立可重复的规范参考框架,因此后续描述阶段很难变得有效。在剩余点中,显着性由最小特征值的大小决定,以便仅包…...

算法刷题Day 58 每日温度+下一个更大元素I
Day 58 单调栈 739. 每日温度 class Solution { public:vector<int> dailyTemperatures(vector<int>& temperatures) {vector<int> rst(temperatures.size());vector<int> decsStk; // 单调递减栈for (int i 0; i < temperatures.size(); i)…...

认识 spring AOP (面向切面编程) - springboot
前言 本篇介绍什么是spring AOP, AOP的优点,使用场景,spring AOP的组成,简单实现AOP 并 了解它的通知;如有错误,请在评论区指正,让我们一起交流,共同进步! 文章目录 前言1. 什么是s…...

将css文件中的px转化为rem
pxToRem.js /*** 使用方式:* 与引入的文件放在同一目录下进行引用配置,执行:node (定义的文件)*/ const fs require(fs) const path require(path) /*** entry:入口文件路径 type:Strng* pxtopx:以倍数转…...

JNI之Java实现远程打印
打印机是最常见的办公设备了。一般情况下如果需要实现打印,可通过前端print.js包来完成。但是,如果要实现智能办公打印,就可以使用JNI技术、封装接口、远程调用实现完成。 导包 jacob:Java COM Bridge <dependency><g…...

YOLOv5基础知识入门(2)— YOLOv5核心基础知识讲解
前言:Hello大家好,我是小哥谈。YOLOV4出现之后不久,YOLOv5横空出世。YOLOv5在YOLOv4算法的基础上做了进一步的改进,使检测性能得到更进一步的提升。YOLOv5算法作为目前工业界使用的最普遍的检测算法,存在着很多可以学习…...

免费的scrum敏捷开发管理工具
Scrum中非常强调公开、透明、直接有效的沟通,这也是“可视化的管理工具”在敏捷开发中如此重要的原因之一。通过“可视化的管理工具”让所有人直观的看到需求,故事,任务之间的流转状态,可以使团队成员更加快速适应敏捷开发流程。 …...

Hive创建外部表详细步骤
① 在hive中执行HDFS命令:创建/data目录 hive命令终端输入: hive> dfs -mkdir -p /data; 或者在linux命令终端输入: hdfs dfs -mkdir -p /data; ② 在hive中执行HDFS命令:上传/emp.txt至HDFS的data目录下,并命名为…...

leetcode 452. 用最少数量的箭引爆气球
2023.8.2 本题思路先将二维数组points按照第一个维度排序, 然后初始化射箭数为1,因为题中提示说了最少有一个气球。 在遍历这些气球,看是否有重叠,如果没有重叠区域,射箭数;如果有重叠区域,更新…...

Pytorch Tutorial【Chapter 3. Simple Neural Network】
Pytorch Tutorial【Chapter 3. Simple Neural Network】 文章目录 Pytorch Tutorial【Chapter 3. Simple Neural Network】Chapter 3. Simple Neural Network3.1 Train Neural Network Procedure训练神经网络流程3.2 Build Neural Network Procedure 搭建神经网络3.3 Use Loss …...

2.虚拟机开启kali_linux
首先你应该搞一个虚拟机,搞虚拟机可以看一下这个 附录三 虚拟机的使用_Suyuoa的博客-CSDN博客 然后你需要搞一个 kali linux的镜像 Get Kali | Kali Linux 镜像下载好之后解压,你会得到一个文件夹包含下面这些文件 之后打开VMware,点击打开虚…...

【StyleGAN2论文精读CVPR_2020】Analyzing and Improving the Image Quality of StyleGAN
【StyleGAN2论文精读CVPR_2020】Analyzing and Improving the Image Quality of StyleGAN 一、前言Abstract1. Introduction2. Removing normalization artifacts2.1. Generator architecture revisited2.2. Instance normalization revisited 3. Image quality and generator …...

医学图像处理
医学图像处理 opencv批量分片高像素图像病理图像色彩特征提取病理图像细微特征提取自动数据标注分类场景下的医学图像分析分割场景下的医学图像分析检测场景下的医学图像分析 , i ] k 8 < * I opencv批量分片高像素图像 医学图像通常是大像素(1920x1080&…...

PyCharm安装使用2023年教程,PyCharm与现流行所有编辑器对比。
与PyCharm类似的功能和特性的集成开发环境(IDE)和代码编辑器有以下几种: Visual Studio Code(VS Code):由Microsoft开发,VS Code是一个高度可定制和可扩展的代码编辑器。它支持多种编程语言&am…...

vue3中CompositionApi理解与使用
CompositionApi,组合式API,相当于react中hooks,函数式。 优势:1,增加了代码的复用性(类似mixin,slot,高阶组件功能) 2,代码可读性更好。可以将处理逻辑和视图…...

【前瞻】视频技术的发展趋势讨论以及应用场景
视频技术的发展可以追溯到19世纪初期的早期实验。到20世纪初期,电视技术的发明和普及促进了视频技术的进一步发展。 1)数字化:数字化技术的发明和发展使得视频技术更加先进。数字电视信号具有更高的清晰度和更大的带宽,可以更快地…...

Visual Studio在Debug模式下,MFC工程中包含Eigen库时的定义冲突的问题
Visual Studio在Debug模式下,MFC工程中包含Eigen库时的定义冲突的问题 报错信息 Eigen\src\Core\PlainObjectBase.h(143,5): error C2061: 语法错误: 标识符“THIS_FILE” Eigen\src\Core\PlainObjectBase.h(143,1): error C2333: “Eigen::PlainObjectBase::opera…...

Java实现购买机票案例
Java实现购买机票案例 需求分析代码实现小结Time 需求分析 1.首先,考虑方法是否需要接收数据处理? 阅读需求我们会发现,不同月份、不同原价、不同舱位类型优惠方案都不一样; 所以,可以将原价、月份、舱位类型写成参数 …...

通用FIR滤波器的verilog实现(内有Lowpass、Hilbert参数生成示例)
众所周知,Matlab 中的 Filter Designer 可以直接生成 FIR 滤波器的 verilog 代码,可以方便地生成指定阶数、指定滤波器参数的高通、低通、带通滤波器,生成的 verilog 代码也可以指定输入输出信号的类型和位宽。然而其生成的代码实在算不上美观…...

有利于提高xenomai /PREEMPT-RT 实时性的一些配置建议
版权声明:转自: https://www.cnblogs.com/wsg1100 一、前言 1. 什么是实时 “实时”一词在许多应用领域中使用,人们它有不同的解释,并不总是正确的。人们常说,如果控制系统能够对外部事件做出快速反应,那么它就是实时运行的。根据这种解释,如果系统速度快,则系统被认…...

【LeetCode】24.两两交换链表中的节点
题目 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 输入:head [1,2,3,4] 输出:…...

融合大数据、物联网和人工智能的智慧校园云平台源码 智慧学校源码
电子班牌系统用以展示各个班级的考勤信息、授课信息、精品课程、德育宣传、班级荣誉、校园电视台、考场信息、校园通知、班级风采,是智慧校园和智慧教室的对外呈现窗口,也是学校校园文化宣传和各种信息展示的重要载体。将大数据、物联网和人工智能等新兴…...

Spring Boot通过切面实现方法耗时情况
Spring Boot通过切面实现方法耗时情况 依赖 <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.9.1</version></dependency>自定义注解 package com.geekmice.springbootself…...

深挖 Threads App 帖子布局,我进一步加深了对CSS网格布局的理解
当我遇到一个新产品时,我首先想到的是他们如何实现CSS。当我遇到Meta的Threads时也不例外。我很快就探索了移动应用程序,并注意到我可以在网页上预览公共帖子。 这为我提供了一个深入挖掘的机会。我发现了一些有趣的发现,我将在本文中讨论。 …...

leetcode做题笔记54
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 思路一:模拟题意 int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize){int m matrixSize; int n matrixColSi…...

GD32F103VE点灯
GD32F103VE点灯主要用来学习端口引脚的输出配置。它由LED.c,LED.h,SoftDelay.c和main.c组成。 #include "gd32f10x.h" //使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t #include "SoftDelay.h"#include …...

matlab使用教程(8)—绘制三维曲面图
1网格图和曲面图 MATLAB 在 x-y 平面中的网格上方使用点的 z 坐标来定义曲面图,并使用直线连接相邻的点。mesh 和surf 函数以三维形式显示曲面图。 • mesh 生成仅使用颜色来标记连接定义点的线条的线框曲面图。 • surf 使用颜色显示曲面图的连接线和面。 MATL…...

【Nginx14】Nginx学习:HTTP核心模块(十一)其它配置
Nginx学习:HTTP核心模块(十一)其它配置 剩下的一些配置指令没有大的归属,不过也有一些是比较常见的,这部分内容学习完成之后,整个 http 模块相关的核心基础配置指令就全部学习完成了。今晚可以举杯庆祝一下…...