「C/C++ 01」scanf()与回车滞留问题

目录

〇、scanf()接收用户输入的流程 

一、回车的缓冲区滞留问题是什么?

二、为什么?

三、四个解决方法:

1. 在前面的scanf()中加上'\n'

2. 在scanf("%c")中添加空格

3. 使用getchar()来吸收回车

4. 使用fflush()清空缓冲区


〇、scanf()接收用户输入的流程 

scanf()接收用户输入的流程为:

        系统将用户输入内容被保存到缓冲区,然后scanf再从缓冲区里读取内容。scanf的第一个参数是从缓冲区里匹配要读取内容的格式,scanf在缓冲区里不断读取,直到匹配到和第一个参数相同的格式的字符串才会取出。

一、回车的缓冲区滞留问题是什么?

运行以下代码你会发现:明明是两个scanf却只能接收一个字符。

#include<stdio.h>
int main()
{char c;printf("请输入第一个字符:");scanf("%c", &c);printf("请输入第二个字符:");scanf("%c", &c);return 0;
}


这就是scanf()的回车滞留问题,即scanf("%c")会吸收滞留在缓冲区的回车。

二、为什么?

        使用scanf()来接收输入时,需要按下回车来确认输入,然后scanf()从缓冲区中取出我们输入的内容。但只要不是的scanf("%c")就会在遇到 空格,Tab,回车 时停止读入,这些空格,Tab,回车包括剩下的输入内容不会消失,而是保留在缓冲区中。一旦这个时候遇到了可以接收这些内容的scanf("%c",&a),scanf("%c",&a)会优先接收这些保留在缓冲区的内容,所以这个时候就不需要我们输入新内容了。

  • scanf("%d",&a)、scanf("%s",&a)等不能接受空格、Tab、回车等,遇到后会停止读取。
  • 停止读取后,剩下的内容会被保存在输入缓冲区。下次的scanf()优先读取这些内容。
  • 仅scanf("%c",&a)可以接收空格、Tab、回车等。
  • 非scanf("%c",&a),如scanf("%s",&a),scanf("%d",&a)等会从缓冲区里找到空格,Tab,回的内容进行读取,读取到内容后再遇到 空格,Tab,回车 时停止读入。

总结下来就是:

        非scanf("%c")在遇到空格,Tab,回车时停止读入,这些内容被保留在缓冲区里,如果此时有scanf("%c"),会直接从缓冲区里读取这些保留内容。
        所以在使用scanf("%c"),getchar(),gets()前一定要先清空缓冲区。

三、四个解决方法:

这四个方法的本质都是在清理缓冲区。

1. 在前面的scanf()中加上'\n'

scanf("%d\n",&n); //使用'\n'过滤回车
scanf("%c",&c);​​​​​​​

scanf的第一个参数是要求用户输入的格式,scanf在缓冲区里不断读取,直到匹配到和第一个参数相同的格式的字符串才会取出。

2. 在scanf("%c")中添加空格

scanf("%d",&n);
scanf(" %c",&c); //%c前面加空格,过滤回车

这种写法会在缓冲区里取出空格/Tab/回车和一个字符,然后把字符赋值给变量。

3. 使用getchar()来吸收回车

scanf("%d",&n);
getchar();  //专门用来读取上次输入的回车符号
scanf("%c",&c);

其实scanf("%c"),getchar(),gets()都可以做到,但一般都用getchar(),因为gets()不安全,很多编译器已经弃用了。

4. 使用fflush()清空缓冲区

scanf("%d",&n)
fflush(stdin);  //清空输入流缓冲区的字符,注意必须引入#include <stdlib.h>头文件
scanf("%c",&c);

注意必须引入#include <stdlib.h>头文件。


------------------------END-------------------------

才疏学浅,谬误难免,欢迎各位批评指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/4950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【火柴题】如何移动一根火柴将2变成5

这里写目录标题 如何移动一根棍子将2变成51、变成第五个字母E2、变成罗马数字5 V3、变成手写体54、商用字体55、古尔穆基数字、藏文数字56、希伯来数字5 如何不动棍子将2变成5使用镜子使用装水的水杯小孔成像透视 如何移动一根棍子将2变成5 1、变成第五个字母E E 2、变成罗马…

力扣HOT100 - 207. 课程表

解题思路&#xff1a; class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {int[] inDegree new int[numCourses];//存每个结点的入度List<List<Integer>> res new ArrayList<>();//存结点之间依赖关系Queue<Integer>…

获客难题怎么破?揭秘那些企业高效拓客的背后秘密

在当今的商业环境中&#xff0c;客户资源的获取是企业生存和发展的关键。然而&#xff0c;传统的获客方式往往既耗时又费力&#xff0c;且效率不高。随着科技的进步和大数据的普及&#xff0c;一种新兴的获客工具——自动获客软件应运而生&#xff0c;它以其精准高效的特点&…

百度文库公测智能漫画和智能话本,有兴趣的可以申请一下

百度文库上线智能文库和智能话本功能&#xff0c;目前处于公测中&#xff0c;我刚申请&#xff0c;还在审核中。 智能漫画&#xff0c;参照官网的示例截图&#xff0c;生成的图片看起来不错&#xff0c;没试用过所以不太清楚他的操作模式是什么 智能话本&#xff0c;生成的话…

【高校科研前沿】华东师大白开旭教授博士研究生李珂为一作在RSE发表团队最新成果:基于波谱特征优化的全球大气甲烷智能反演技术

文章简介 论文名称&#xff1a;Developing unbiased estimation of atmospheric methane via machine learning and multiobjective programming based on TROPOMI and GOSAT data&#xff08;基于TROPOMI和GOSAT数据&#xff0c;通过机器学习和多目标规划实现大气甲烷的无偏估…

python学习笔记----函数(五)

一、函数介绍 在 Python 中&#xff0c;函数是一个组织好的、可重用的代码块&#xff0c;用来执行一个单一的、相关的动作。函数提供了代码的模块化和代码复用的能力。它可以接受输入参数&#xff0c;并可以返回一个结果。函数在 Python 编程中是基本的构建块之一。 二、函数…

Docker深入探索:网络与资源控制、数据管理与容器互联以及镜像生成

目录 一、 Docker网络 &#xff08;一&#xff09;Docker网络实现原理 &#xff08;二&#xff09;Docker网络模式 1. Bridge网络&#xff08;默认&#xff09; 2. Host网络 3. None网络 4. Container网络 5. 自定义网络 二、资源控制 &#xff08;一&#xff09;cgr…

电池管理协议SMBus/I2C在STM32CubeMX配置使用-读取SN8765电池组

一、前言 目前有个电源组需要通过i2c进行读取&#xff0c;获取一些电池信息&#xff0c;采用SMBus协议进行读取&#xff0c;其可以看作i2c的子集&#xff0c;可以直接通过i2c的接口进行读写。SMBus建立在被广泛采用的I2C总线之上&#xff0c;并定义了OSI&#xff08;开放系统互…

进行RLC防孤岛负载测试的步骤和规范

RLC防孤岛负载测试是用于检测并防止电力系统出现孤岛现象的测试方法&#xff0c;孤岛现象是指当电网因故障或停电而与主电网断开连接时&#xff0c;部分电力设备仍在运行&#xff0c;形成一个没有与主电网连接的独立电网。这种情况下&#xff0c;如果电力设备不能及时检测到孤岛…

职场人是如何被拉开差距的?

事实上&#xff0c;职场人的差距从第一天就拉开了。 心理学里有一个词&#xff0c;叫做“首因效应&#xff0c;说的是人们在第一次接触时形成的印象&#xff0c;将会决定后续认知的基调。 入职第一天&#xff0c;从自我介绍开始&#xff0c;展示自己的特长&#xff0c;给大家…

IOT病毒分析

前言&#xff1a; 最近审计报警日志&#xff0c;发现了一个IOT病毒&#xff0c;利用的是CVE-2023-1389漏洞扫描tplink&#xff0c;进行攻击&#xff0c;有点意思&#xff0c;拿出来分析下。 发现&#xff1a; 查看流量日志&#xff0c;发现了一个有问题的访问&#xff1a; 访…

【ArcGIS 疑难杂症】无法展开和读取xls、xlsx文件

xls、xlsx文件在ArcGIS中经常用来链接属性。 但是无论ArcMap还是ArcPro&#xff0c;打开xls、xlsx文件时候可能会出现报错。 比如&#xff0c;ArcMap可以打开xls&#xff0c;但是打开xlsx时会出现下面的报错。 而ArcPro就更逊了&#xff0c;xls、xlsx两种都打不开。 以上是小…

网工内推 | 网络工程师,CCIE认证优先,最高10k*13薪

01 广东丰德科技有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、负责运营商机房的网络设备的运行维护、故障应急处理&#xff1b; 2、负责各类型网络设备或网络相关的故障的故障分析及诊断&#xff1b; 3、独立完成网络项目的方案设计编写并负责方案的验证…

STM32用HAL库函数实现硬件IIC

/*出处&#xff1a;【STM32入门教程-2024】第12集 IIC通信与温湿度传感器AHT20(DHT20)_哔哩哔哩_bilibili */ AHT20驱动 这篇笔记我主要介绍代码实现&#xff0c;想要了解原理的请自己看视频&#xff0c;我不过多赘述了。 AHT20通信数据帧格式&#xff1a; ①对照手册上的通…

IFM420-WRDUWZ电动机保护器EOCR-iFM420窗孔0.5-80A

韩国三和&#xff0c;EOCR&#xff0c;SAMWHA&#xff0c;Schneider&#xff0c;施耐德&#xff0c;电机保护器&#xff0c;电动机保护器&#xff0c;电子式电动机保护继电器&#xff0c;电子式过电流继电器&#xff0c;电子式欠电流继电器&#xff0c;电子式电压继电器&#x…

探索大数据混合分层架构:构建智能数据管理平台

随着大数据技术的发展和应用场景的不断拓展&#xff0c;传统的单一数据处理架构已经不能满足复杂多变的业务需求。在这样的背景下&#xff0c;大数据混合分层架构应运而生&#xff0c;成为了构建智能数据管理平台的关键。本文将深入探讨大数据混合分层架构的设计原则、核心组件…

JS事件循环、宏任务与微任务

在JavaScript中&#xff0c;事件循环&#xff08;Event Loop&#xff09;是处理异步操作的核心机制。它负责执行代码&#xff0c;处理事件&#xff0c;并在适当的时候调度回调。为了更好地理解JavaScript的执行模型&#xff0c;我们需要深入探讨事件循环、宏任务&#xff08;Ma…

从文本框限制字符输入,理解代码抽象过程(四次抽象到简单工厂到反射)

这里写目录标题 背景原因抽象过程第一次抽象第二次抽象第三次抽象第四次抽象简单工厂反射 背景 学生信息管理系统中有很多文本框的校验&#xff0c;其中有一点&#xff0c;就是不允许输入过长的信息。 原因 1、文本框校验限制输入长度确保用户内容不超出系统或数据库容量限制…

基于SpringBoot+Vue高校宣讲会管理系统设计与实现

项目介绍&#xff1a; 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装高校宣讲会管理系统软件来发挥其高效地信息…

2024五一劳动节活动策划方案

2024五一劳动节朋克国风养生局&#xff08;回春集主题&#xff09;活动策划方案-48P 方案页码&#xff1a;48页 文件格式&#xff1a;pptx 方案简介&#xff1a; 大健康线下活动屡屡出圈 近年来&#xff0c;随着健康意识和生活水平的提升 人们对于自身健康越发关注&#…