【C语法学习】10 - scanf()函数
文章目录
- 0 前言
- 1 函数原型
- 2 参数
- 2.1 格式字符串
- 2.1.1 转换说明
- 2.2 参数列表
- 3 返回值
- 4 读取机制
- 4.1 基本概念
- 4.2 转换说明
- 4.3 读取过程
- 4.4 读取示例
- 4.5 多参数
- 6 示例
- 6.1 示例1
- 6.2 示例2
- 6.3 示例3
- 6.4 示例4
0 前言
scanf()函数虽然使用起来较为灵活,但是其读取机制还是有点复杂。
1 函数原型
scanf():从标准输入流stdin读取格式化输入,函数原型如下:
int scanf(const char *format, ...);
2 参数
scanf()函数的参数分为两类:
- format :格式字符串;
- … :参数列表。
2.1 格式字符串
在scanf()函数中:
- 格式字符串是必不可少的;
- 格式字符串由字面文本量、转义序列和转换说明三部分组成。
2.1.1 转换说明
- 格式字符串中的转换说明和参数列表在数量、顺序和类型上要完全匹配;
- 格式字符串中只包含转换说明即可,强烈建议不要包括字符串字面量和转义序列,但多个转换说明之间可以用空格隔开,便于阅读;
- 如果想从键盘获取字符,建议用getchar()函数替代%c;
- 如果想从键盘获取字符串,建议用gets()函数替代%s;%s会读取的字符串末尾加上空字符’\0’,作为字符串结束符;
- 与printf()函数不同,在scanf()函数中,%f对应float类型变量,%lf对应double类型变量。
2.2 参数列表
在scanf()函数中:
- 参数列表是必不可少的;
- 参数列表中参数的数量是可变的,但至少应包含一个参数;
- 参数列表中参数的类型是指针类型(&变量名)。
3 返回值
scanf()函数的返回值类型为int型:
- 读取成功,返回成功读取的项数;
- 读取失败,返回EOF。
C语言标准描述如下:
1. Both scanf and wscanf return the number of fields successfully converted and assigned; the return value does not include fields that were read but not assigned. A return value of 0 indicates that no fields were assigned.
2. The return value is EOF for an error or if the end-of-file character or the end-of-string character is encountered in the first attempt to read a character.
4 读取机制
4.1 基本概念
- 键盘输入:从键盘输入的都是文本,因为键盘只能生成文本字符:字母、数字和标点符号;
- 空白字符:空格、制表符和换行符。
4.2 转换说明
转换说明不同,有效字符也不同:
- %d转换说明要求scanf()函数能识别十进制数0-9和正负号±;
- %x转换说明要求scanf()函数能识别十六进制数a-f和A-F;
- %f转换说明要求scanf()函数能识别小数点、e计数法和p计数法等;
- %s转换说明要求scanf()函数能识别除空白字符外的所有字符。
4.3 读取过程
scanf()函数读取标准输入流stdin过程如下:
- 在遇到第一个非空白字符前,所有的空白字符被读出且被丢弃;
- 从遇到第一个非空白字符始,直至
(1)遇到无效字符:在遇到的第一个无效字符处停止读取,并将无效字符退回至标准输入流stdin中;
(2)遇到空白字符:在遇到的第一个空白字符处停止读取,并将空白字符退回至标准输入流stdin中;
(3)达到指定字段宽度:如果使用字段宽度修饰符,在有效字符数达到指定字段宽度处停止读取; - 读取结束后对已读取的有效字符按照转换说明进行转换,然后储存在指定变量中。
特别说明:使用scanf()函数之后一定要清空标准输入流stdin。
4.4 读取示例
以scanf(“%d”, &num)为例:
- scanf()函数从标准输入流stdin中读取字符,跳过前面所有的空白字符,从第一个非空白字符开始,直至
(1)遇到无效字符,将无效字符退回至标准输入流stdin中,读取结束;
(2)遇到空白字符,将空白字符退回至标准输入流stdin中,读取结束;
(3)达到指定字段宽度,读取结束; - 将已读取的有效字符按照转换说明要求进行转换,并储存在指定的变量num中;
问题:如果第一次读到的非空白字符是无效字符(如字母a),会发生什么情况呢?
解答:如上所述,如果读到字母a,则立即停止读取,并将字母a退回stdin中,那么本次读取就未读到任何有效的字符,也就是说本次读取是失败的,不会有任何值储存在变量num中,scanf()函数的返回值为0。
4.5 多参数
参数列表中的多个参数对应格式字符串中的多个转换说明:
- 用空白字符将键盘输入分成多个字段;
- 字段间可以有多个空白字符,多个空白字符集中在一行或分散在多行;
- 多个字段与多个转换说明;
- 唯一例外的是%c转换说明:根据%c,scanf()函数会读取每个字符,包括空白字符。
6 示例
6.1 示例1
scanf()函数读取过程中的丢弃和回退,代码如下所示:
int main ()
{//定义变量int a;char str[80] = {0};//给变量a赋值,输入2个空格+12a+2个空格+Enterscanf("%d", &a);//打印变量a的值printf("a=%d\n", a);//用gets清空stdingets(str);//打印str的内容和长度printf("str = %s, len = %d\n", str, strlen(str));return 0;
}
代码执行结果如下图所示:
代码及运行结果分析:
第一阶段:
- 标准输入流中有字符:2个空格+字符12a+2个空格+回车符共8个字符;
- scanf()函数读取前两个空格并丢弃;
- scanf()函数读取字符1和2,转换为数值12后储存在变量a中;
- scanf()函数读取字符a,发现a是无效字符,将a回退至标准输入流stdin中;
- 至此scanf()函数从标准输入流stdin中读取完毕;
第二阶段:
6. gets()函数继续从标准输入流stdin中读取字符串;
7. 因标准输入流stdin中仍残留有scanf()函数未读完的字符,故无需用户再次从键盘键入字符;
8. gets()函数会读空标准输入流stdin中的所有字符,直至遇到回车符’\n’;
第三阶段:
9. printf()函数打印a和str的内容,并统计str的长度;a=12符合预期;str长度为3符合预期,即字符’a’+2个空格。
6.2 示例2
scanf()函数返回值,代码如下所示:
void clear_stdin(void)
{while (getchar() != '\n');
}int main()
{//变量定义int a = 0, b = 0, c = 0;int num = 0;//第1次输入puts("输入11 22 33 : ");num = scanf("%d%d%d", &a, &b, &c);clear_stdin();printf("a=%d, b=%d, c=%d, num=%d\n\n", a, b, c, num);//第2次输入puts("输入44 55 a6 : ");num = scanf("%d%d%d", &a, &b, &c);clear_stdin();printf("a=%d, b=%d, c=%d, num=%d\n\n", a, b, c, num);//第3次输入puts("输入77 a8 99 : ");num = scanf("%d%d%d", &a, &b, &c);clear_stdin();printf("a=%d, b=%d, c=%d, num=%d\n\n", a, b, c, num);//第4次输入puts("输入a0 11 22 : ");num = scanf("%d%d%d", &a, &b, &c);clear_stdin();printf("a=%d, b=%d, c=%d, num=%d\n\n", a, b, c, num);return 0;
}
代码执行结果如下图所示:
代码及运行结果分析:
- scanf()函数在%d转换说明下,希望从标准输入流stdin中读取数字字符0-9和正负符号(±),当读取到非数字字符’a’时,将’a’退回至标准输入流stdin中,并停止读取;理论分析和num的实际打印结果相符合。
6.3 示例3
scanf()函数读取字符%c,代码如下所示:
void clear_stdin(void)
{while (getchar() != '\n');
}int main()
{//变量定义char c1 = 0, c2 = 0, c3 = 0;//第1次输入puts("输入字符abc,中间不加空格 : ");scanf("%c%c%c", &c1, &c2, &c3);clear_stdin();printf("c1=%c, c2=%c, c3=%c\n\n", c1, c2, c3);//第2次输入puts("输入字符a b c,中间加空格 : ");scanf("%c%c%c", &c1, &c2, &c3);clear_stdin();printf("c1=%c, c2=%c, c3=%c\n", c1, c2, c3);return 0;
}
代码执行结果如下图所示:
代码及运行结果分析:
- scanf()函数在%c转换说明下会读取键盘键入的每一个字符,包括空白字符。
6.4 示例4
scanf()函数读取字符串%s,代码如下所示:
void clear_stdin(void)
{while (getchar() != '\n');
}int main()
{//变量定义char str[80] = { 0 };//puts("输入hello world");scanf("%s", str);clear_stdin();puts(str);return 0;
}
代码执行结果如下图所示:
代码及运行结果分析:
- scanf()函数在读取字符的时候,如果遇到空白字符,则停止读取,所以%s只能读取单词,不能读取句子。
相关文章:

【C语法学习】10 - scanf()函数
文章目录 0 前言1 函数原型2 参数2.1 格式字符串2.1.1 转换说明 2.2 参数列表 3 返回值4 读取机制4.1 基本概念4.2 转换说明4.3 读取过程4.4 读取示例4.5 多参数 6 示例6.1 示例16.2 示例26.3 示例36.4 示例4 0 前言 scanf()函数虽然使用起来较为灵活,但是其读取机…...

ffmpeg mp3截取命令,视频与mp3合成带音频视频命令
从00:00:03.500开始截取往后长度到结尾的mp3音频(这个更有用,测试好用) ffmpeg -i d:/c.mp3 -ss 00:00:03.500 d:/output.mp3 将两个音频合并成一个音频(测试好用) ffmpeg -i "concat:d:/c.mp3|d:/output.mp3&…...

文件夹还在,里面文件没了?问题这样解决
文件夹还在但文件无故消失怎么办?文件的消失对于我们来说可能是个令人沮丧且困惑的问题。有时候,我们可能会发现文件夹依然存在,但其中的文件却消失了。在这篇文章中,我们将探讨为什么电脑文件会无故消失的原因,并提供…...
使用 OpenCV 和 Tesseract OCR 进行车牌识别
您将了解自动车牌识别。我们将使用 Tesseract OCR 光学字符识别引擎(OCR 引擎)来自动识别车辆牌照中的文本。 Python-tesseract: Py-tesseract 是 Python 的光学字符识别 (OCR) 工具。也就是说,它将识别并“读取”图像中嵌入的文本。Python-tesseract 是 Google 的 Tessera…...
What exactly are the practices involved in DevOps?
目录 1. Continuous Integration (CI) 2. Continuous Deployment (CD) 3. Infrastructure as Code (IAC) 4. Configuration Management 5. Monitoring and Logging 6. Automated Testing 7. Collaboration and Communication 8. Microservices Architecture 9. Conta…...

Spring底层原理(五)
Spring底层原理(五) 本章内容 介绍Aware接口与InitializingBean接口、Bean的初始化与销毁、Scope Aware接口 作用:用于注入一些与容器相关的信息 类名作用BeanNameAware注入Bean的名称BeanFactoryAware注入BeanFactory容器ApplicationContextAware注入ApplicationContext容…...
算法的基本概念(数据结构与算法)
数据结构是指数据元素之间的关系和组织方式,在计算机科学中被广泛应用于存储和操作数据的方法和技术。 数据元素: 数据元素是构成数据的基本单位,可以是数字、字符、记录等。 数据项: 数据元素中的一个部分,表示一个属…...

高阶数据结构学习——LRU Cache
文章目录 1、了解LRU Cache(Least Recently Used缩写)2、代码实现 1、了解LRU Cache(Least Recently Used缩写) Cache是缓存,在磁盘和内存之间,内存和寄存器之间都存在,CPU和内存之间存在三级缓…...

代码冲突解决
远程仓库修改 本地代码修改 接下来我们push一下 如果使用IDE 冲突内容如下: 我们可以使用自带的工具进行修改 我们选择接受自己改动的即可 如果使用git工具怎么去处理呢 远程分支是这样 本地是这样的 add和commit之后,再pull,最后pus…...

c/c++程序的内存开辟时 的内存情况
我们写的代码都是要存放在内存空间中的,我们经常说堆区,静态区,还有栈区,相信很多人不是很明白,在今天这篇博客中让大家对它们有一个粗略的认识 1.栈区(static) 在执行函数时,函数内…...

【linux常用命令+vi编辑器_2023.11.3】
芯片开发 Linux/Unix(环境) EDA工具TCL(波形) SVN/GIT(版本控制) Makefile(脚本语言) Perl/Python(脚本语言) Vim/Gvim(编辑器) 命令…...

okhttp post请求 header post参数加密遇到的两个问题
如果你对于网络请求用了https后是否还有必要对参数加密有疑问可以看我上篇的文章:网络安全https 记得耐心看完,下面说问题: Caused by: java.lang.IllegalArgumentException: Unexpected char 0x0a 一开始以为是okhttp框架对特殊字符做了现在…...

什么是Webpack的loader和plugin?它们的作用是什么?
聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...
ESXi for ARM 最新下载地址
由于VMware决定关闭 flings.vmware.com 网站,内容被迁移到不同的地方,网站跳转到 Code Samples and PowerCLI Example Scripts | VMware - VMware {code} ESXi for ARM的下载地址迁移到了 https://customerconnect.vmware.com/downloads/get-download?…...

2. 网络之网络编程
网络编程 文章目录 网络编程1. UDP1.1 DatagramSocket1.1.1 DatagramSocket 构造方法1.1.2 DatagramSocket 方法: 1.2 DatagramPacket1.2.1 DatagramPacket构造方法1.2.2 DaragramPacket方法1.2.3InetSocketAddress API 1.3 UDP回显服务器1.3.1 框架结构1.3.2 读取请…...

工作数字化的中国历程 | 从 OA 到 BPM 到数字流程自动化
业务流程是由“活动”(或称“工作任务”)构成的,在企业里的所有工作是不是都叫流程,或者属于流程的一部分,这个概念很绕,我觉得没有必要去做学究气的辨析。我曾经提出过一个从工作的两个特性(产…...
6-1 二叉排序树查找操作
description 本题要求实现二叉排序树的查找操作。 函数接口定义: BSTree SearchBST(BSTree T,ElemType e); 其中BSTree结构定义如下: typedef int ElemType; typedef struct BSTNode { ElemType data; struct BSTNode *lchild,*rchild; }BSTNode,*BS…...

服务上千家企业,矩阵通2.0重磅上线,全链路管理新媒体矩阵
自上线以来 矩阵通已服务了上千家企业级客户 覆盖汽车、家居、媒体、金融、教育等多个行业 矩阵通1.0时代 我们以“数据”为基座打造出10功能 帮助企业轻松管理新媒体矩阵 实现账号管理、数据分析、竞对监测、 人员考核、风险监管等需求 而现在 矩阵通2.0重磅上线 新增…...
【代码随想录】算法训练计划11
1、20. 有效的括号 题目: 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号…...

Jmeter之JSR223
一、JSR223组件 JSR是Java Specification Requests的缩写,意思是Java规范提案。JSR已成为Java界的一个重要标准. JSR223其实包含了有好几种组件,但是其用法都是一致的,并且都是执行一段代码,主要分类如下: JSR223 PreProcessor JSR223 Timer JSR223 S…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...