C语言学习初级阶段(数据)——scanf读取标准输入

news2024/11/24 7:50:12

文章目录

  • 一、scanf函数的原理
      • 1.1、自己理解
      • 1.2、王道解释
      • 1.3、注意

一、scanf函数的原理

  • 输入和输出是通过标准函数库实现的,C语言通过scanf函数读取键盘输入,键盘输入又称标准输入
  • 当scanf函数读取标准输入时,如果还没有输入任何内容,那么scanf函数会被卡住(专业用于为阻塞)。
  • scanf输入的其实全部都是字符串,要把输入的字符串转换成相应的格式类型。scanf(“%d”,&i); scanf里面的前后类型要一致

1.1、自己理解

#include <stdio.h>

//scanf用来读取标准输入,scanf把标准输入的内容存放到某个变量空间,因此变量必须取地址
int main(){
    int i;
    char c;
    scanf("%d",&i);
    printf("i=%d\n",i);
    scanf("%c",&c);
    printf("c=%c\n",c);
    return 0;
}

输出结果:
在这里插入图片描述
为什么标准输入C,但是为什么空了2行呢?
因为第一个scanf输入相当于是一个字符串,实际上输入的是10\n,但是%d只会读取0-9的字符,不会读取\n,所以第一printf打印的是10
第二个printf打印的是\n,因为%c取的是字符串,\n是一个短义字符,所以%c会读取它。
因为scanf标准输入的时候,必须按回车才能生效。一个回车相当于一个\n,所以会打印2个\n。

如何解决这个问题呢?
在两个scanf之间加入 fflush(stdin);//清空标准输入缓冲区即可
运行结果如下:
在这里插入图片描述

1.2、王道解释

在这里插入图片描述
行缓冲:在这种情况下,当在输入和输出中遇到换行符时,将执行真正的IO处理操作,这时,我们输入的字符先存放到缓冲区中,等按下回车键换行时才进行实际的I/O操作.
典型代表是标准输入缓冲区(stdin)和标准输出缓冲区(stdout) , printf 使用的是stdout 。

如上面的例子所示,我们向标准输入缓冲区中放入的字符为’20\n’,(scanf输入的都是字符串,字符串后面都会有\n)输入’\n’(回车)后, scanf函数才开始匹配, scanf函数中的%d 匹配整型数20,然后放入变量i中,接着进行打印输出,这时’\n’仍然在标准输入缓冲区(stdin)内,如果第二个scanf函数为scanf(“%d”,&i),那么依然会发生阻塞

scanf函数匹配一个字符时,会在缓冲区删除对应的字符.因为在执行scanf(“%c”,&c)语句时,不会忽略任何字符,所以scanf(“%c”,&c)读取了还在缓冲区中残留的’\n’.

#include <stdio.h>

//scanf用来读取标准输入,scanf把标准输入的内容存放到某个变量空间,因此变量必须取地址
int main(){
    int i;
    char c;
    float f;
    scanf("%d",&i);
    printf("i=%d\n",i);
    // fflush(stdin);//清空标准输入缓冲区
    // scanf("%c",&c);
    // printf("c=%c\n",c);
    scanf("%f",&f);
    printf("f=%f",f);
    return 0;
}

输出结果:
20
i=20
98.5
f=98.500000
此结果,输入20之后,生成了i=20,其次输入98.5,在生成f=98.500000。发生了阻塞
为什么scanf读取浮点数的时候,在两个scanf之间不用fflush(stdin)来清空标准输入缓冲区呢?

因为scanf函数在读取整型数、浮点数、字符串(后面介绍数组时讲解字符串)时,会忽略’\n’(回车符)、空格符等字符〈忽略是指scanf函数执行时会首先删除这些字符,然后再阻塞)

解释:
当标准输入20的时候,相当于一个字符串,20\n就存入到了标准输入缓冲区,然后%d会读取20,此时标准输入缓冲区内剩下了\n,%f开始读取\n,但是%f是读取浮点数,\n是转义字符,遇到它的时候,就会忽略情况\n。
为什么会发生阻塞卡住?
因为标准输入缓冲区内为空,所以会卡住。不空,则不会发生阻塞卡住。

1.3、注意

#include <stdio.h>

//scanf一次读取多种类型
int main(){
    int i,ret;
    char c;
    float f;
    ret=scanf("%d %c%f",&i,&c,&f);//ret是scanf匹配成功的个数
    printf("i=%d,c=%c,f=%5.2f\n",i,c,f);
    return 0;
}

在scanf输入多个的时候,如果%c在中间一定要在%c前面加一个空格,如果%c在开头就不要加空格。
scanf在键盘输入的时候,输入一个数就按一个空格,目的就是区分输入的是不同的数,而不是一个数。

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

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

相关文章

如何提升产品用户体验?4个工具+6张案例,让你快速吃透!

在数字时代的浪潮中&#xff0c;产品用户体验早已不再是简单的“好用”或“不好用”的评判标准&#xff0c;它不仅仅是功能的堆砌&#xff0c;更是情感的连接、智慧的体现。在这个竞争激烈的市场中&#xff0c;只有那些能够深入理解用户需求、精准把握用户心理的产品&#xff0…

ES6中 Promise的详细讲解

文章目录 一、介绍状态特点流程 二、用法实例方法then()catchfinally() 构造函数方法all()race()allSettled()resolve()reject() 三、使用场景# 参考文献 一、介绍 Promise&#xff0c;译为承诺&#xff0c;是异步编程的一种解决方案&#xff0c;比传统的解决方案&#xff08;…

(学习日记)2024.04.09:UCOSIII第三十七节:事件函数接口

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

uniapp请求后端接口

新建文件夹utils const request (config) > {// 拼接完整的接口路径config.url http://mm.test.cn config.url;//这里拼接的是访问后端接口的地址&#xff0c;http://mm.test.cn/prod-api/testconsole.log(config.url)//判断是都携带参数if(!config.data){config.data …

比派科技(BananaPI) 和 Qbee 达成战略合作伙伴关系,共同推动物联网技术发展

比派科技&#xff08;Banana PI&#xff09;&#xff08;https://banana-pi.org/&#xff09;和Qbee&#xff08;https://qbee.io/&#xff09;很高兴地宣布建立战略合作伙伴关系&#xff0c;旨在推动物联网&#xff08;IoT&#xff09;技术领域的创新和发展。 作为在物联网领…

[官方推荐]通义灵码做活动,送礼品,快来薅羊毛!!!

你的编辑器装上智能ai编辑了吗&#xff0c;的确挺好用的。 最近阿里云AI编码搞活动&#xff0c;可以免费体验并且还可以抽盲盒。有日历、马克杯、代金券、等等其他数码产品。 大多数都是日历。 点击链接参与「通义灵码 体验 AI 编码&#xff0c;开 AI 盲盒」 https://develope…

代码随想录阅读笔记-二叉树【总结】

二叉树的理论基础 代码随想录 (programmercarl.com)&#xff1a;二叉树的种类、存储方式、遍历方式、定义方式 二叉树的遍历方式 深度优先遍历 代码随想录阅读笔记-二叉树【递归遍历】-CSDN博客&#xff1a;递归三部曲初次亮相代码随想录阅读笔记-二叉树【迭代遍历】-CSDN博…

护眼灯值不值得买?入手不亏护眼灯十大品牌推荐

如今&#xff0c;我们不难发现越来越多的人早早地戴上了眼镜。这背后&#xff0c;或许是频繁接触电子产品&#xff0c;或许是长时间的学习&#xff0c;又或许是长时间处于不健康的光线环境。无论原因如何&#xff0c;我们都深知营造良好的光线环境对于保护视力至关重要。市面上…

Maven POM元素解析

这是对Maven中使用的Maven项目描述符的引用。 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/…

SQL语法 之 数据库多表查询

对这篇文章的延申 Mysql-全外连接-Union和Union ALL的辨析及练习-CSDN博客 其他SQL系列文章&#xff1a; MySQL《一》-数据库基础_宋红康主要课程-CSDN博客 MySQL《二》-基本查询语句&#xff08;Select)-CSDN博客 Mysql - 定点型(DECIMAL)的使用详解及练习-CSDN博客 MySQ…

RuleEngine规则引擎底层改造AviatorScript 之公式规则

前情提要&#xff0c;看上一个文章&#xff0c;具体要实现的效果就是 当然上来的问题就是前端的问题&#xff0c;这个框首先他们用的是富文本&#xff0c;富文本传到后台的结果是前端脚本&#xff0c;带着h5的标签&#xff0c;后面改成了这个&#xff0c;当时这个东西其实和后…

【Linux】TCP编程{socket/listen/accept/telnet/connect/send}

文章目录 1.TCP接口1.1socket文档 1.2listen拓&#xff1a;端口号8080 1.3accept拓&#xff1a;今天全局函数 1.4读写接口1.5telnet1.一个客户端2.两个客户端 1.6ulimit -a1.7常识回顾1.8connect1.9拓&#xff1a;客户端的ip和地址什么时候被分配&#xff1f;1.10拓&#xff1a…

【接口自动化】参数化替换

在做接口测试时&#xff0c;除了测单个接口&#xff0c;还需要进行业务链路间的接口测试 比如[注册-登陆]需要token鉴权的业务流 当我们用使用postman/jmeter等工具时&#xff0c;将注册接口的一些响应信息提取出来&#xff0c;放到登陆接口的请求中&#xff0c;来完成某个业务…

【Redis】Redis群集的三种模式(主从、哨兵、群集)

redis群集有三种模式&#xff0c;分别是主从同步/复制、哨兵模式、Cluster&#xff0c;下面会讲解一下三种模式的工作方式&#xff0c;以及如何搭建cluster群集 ●主从复制&#xff1a;主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制基础上实现高可用的。主…

Qt案例 通过调用Setupapi.h库实现对设备管理器中设备默认驱动的备份

参考腾讯电脑管家-软件市场中的驱动备份专家写的一个驱动备份软件案例&#xff0c;学习Setupapi.h库中的函数使用.通过Setupapi.h库读取设备管理器中安装的设备获取安装的驱动列表&#xff0c;通过bit7z库备份驱动目录下的所有文件. 目录导读 实现效果相关内容示例获取SP_DRVIN…

DevOps已死?2024年的DevOps将如何发展

随着我们进入2024年&#xff0c;DevOps也发生了变化。新兴的技术、变化的需求和发展的方法正在重新定义有效实施DevOps实践。 IDC预测显示&#xff0c;未来五年&#xff0c;支持DevOps实践的产品市场继续保持健康且快速增长&#xff0c;2022年-2027年的复合年增长率&#xff0…

数字人解决方案——Champ单个视频单张图像生成可控且一致的人体视频生成

概述 Champ是阿里巴巴集团、南京大学和复旦大学的研究团队共同提出了一种创新的人体动画生成技术&#xff0c;Champ能够在仅有一段原始视频和一张静态图片的情况下&#xff0c;激活图片中的人物&#xff0c;使其按照视频中的动作进行动态表现&#xff0c;极大地促进了虚拟主播…

Git-LFS 远程命令执行漏洞 CVE-2020-27955 漏洞复现

今天遇到了一个比较有意思的洞&#xff0c;复现一下下.......... 漏洞描述 Git LFS 是 Github 开发的一个 Git 的扩展&#xff0c;用于实现 Git 对大文件的支持 一些受影响的产品包括Git&#xff0c;GitHub CLI&#xff0c;GitHub Desktop&#xff0c;Visual Studio&#xff0…

C#开发常用的库使用-Ioc库Autofac的使用

介绍 Autofac 是一个适用于 .NET 的强大的 IoC&#xff08;控制反转&#xff09;容器。它管理类之间的依赖关系&#xff0c;使得随着应用程序规模和复杂性的增长&#xff0c;应用程序仍然易于修改。它允许您管理 .NET 应用程序中的组件依赖关系&#xff0c;并自动将依赖项解析…

数据库(mysql)-基本查询语句(DQL)

查询语句 这边查询是给予一定表格,这边先做个解释 教师表包括(name(姓名),gender(性别),salary(工资),title(职位),subject_id(课程的编号),comm(奖金)) 学生表包括(姓名(name),gender(性别),job(职位),生日(birth)) 模版 SELECT 字段名 FROM 查询表 WHERE 查询语句 或与非…