当前位置: 首页 > article >正文

【C语言】printf、scanf

上期回顾 【C语言】分支与循环—rand、srand、time其他篇章 【C语言专栏】其他专栏 【Linux专栏】文章目录一、printf1、printf的基本用法2、占位符3、常用占位符列举4、限定宽度5、输出部分字符串6、限定小数位数7、显示正负号二、scanf1、scanf的基本用法2、scanf的返回值3、占位符4、赋值忽略符一、printf1、printf的基本用法将参数文本输出到屏幕上但需注意的是不会在行尾自动添加换行符运⾏结束后光标就停留在输出结束的地⽅不会自动换行。为了让光标移到下⼀⾏的开头可以在输出⽂本的结尾添加⼀个换⾏符 “\n” 。#includestdio.hintmain(void){printf(Hello World\n);return0;}运行结果注printf() 是在标准库的头⽂件 “stdio.h”定义的。使⽤这个函数之前必须在源码⽂件头部引⼊这个头⽂件。2、占位符2. 1 所谓 “占位符”就是这个位置可以⽤其他值代⼊printf() 可以在输出⽂本中指定占位符。如#includestdio.hintmain(){printf(There are %d apples\n,3);//这里的%d就是占位符return0;}运行结果注意占位符的第⼀个字符⼀律为百分号 % 第⼆个字符表⽰占位符的类型 %d 表⽰这⾥代⼊的值必须是⼀个整数。printf() 的第⼆个参数就是替换占位符的值上⾯的例⼦是整数 3 替换 %d 。执⾏后的输出结果就是 There are 3 apples 。2.2 此外类似的还有%s它表示代入的是一个字符串#includestdio.hintmain(){printf(%s will come tonight\n,Qianyv);return0;}运行结果%s 表⽰代⼊的是⼀个字符串所以 printf() 的第⼆个参数就必须是字符串这里我写了“ Qianyv”执⾏后的输出就是 “Qianyv will come tonight ”。2.3 输出文本里面还可以使用多个占位符如#includestdio.hintmain(){printf(%s says it is %d oclock\n,Qianyv,21);return0;}运行结果输出⽂本%s says it is %d o’clock有两个占位符– 第⼀个是字符串占位符%s 对应第⼆个参数Qianyv– 第⼆个是整数占位符%d对应第三个参数21。执⾏后的输出就是 :lisi says it is 21 o’clock3、常用占位符列举%c字符%d十进制整数int%f 小数float-%f、doule-%lf%x ⼗六进制整数%s 字符串%o ⼋进制整数%p 指针⽤来打印地址%Lf long double 类型浮点数%u ⽆符号整数unsigned int4、限定宽度4.1 printf() 允许限定占位符的最⼩宽度。#includestdio.hintmain(){printf(%5d\n,123);// 输出为 123return0;}%5d 表⽰这个占位符的宽度⾄少为5位。如果不满5位对应的值的前⾯会添加空格。输出的值默认是右对⻬即输出内容前⾯会有空格4.2 如果希望改成“左对齐”在输出内容后面添加“空格”可以在占位符的 % 的后⾯插⼊⼀个 - 号。#includestdio.hintmain(){printf(%-5d\n,123);// 输出为 123 return0;}运行结果4.3 对于⼩数这个限定符会限制所有数字的最⼩显⽰宽度。#includestdio.hintmain(){printf(%12f\n,123.45);return0;}// 输出 123.450000%12f 表⽰输出的浮点数最少要占据12位。由于⼩数的默认显⽰精度是⼩数点后6位所以 123.45 输出结果的头部会添加2个空格。5、输出部分字符串%s 占位符⽤来输出字符串默认是全部输出。如果只想输出开头的部分可以⽤ %.[m]s 指定输出的⻓度其中 [m] 代表⼀个数字表⽰所要输出的⻓度。#includestdio.hintmain(){printf(%.5s\n,hello world);return0;}// 输出 hello上⾯⽰例中占位符 %.5s 表⽰只输出字符串“hello world”的前5个字符即“hello”。6、限定小数位数6.1 输出⼩数时有时希望限定⼩数的位数。举例来说希望⼩数点后⾯只保留两位占位符可以写成 %.2f 。#includestdio.hintmain(){printf(Number is %.2f\n,0.5);return0;}// 输出 Number is 0.50上⾯⽰例中如果希望⼩数点后⾯输出3位 0.500 占位符就要写成 %.3f 。6.2 此外限定小数位数可以与限定宽度占位符结合使用#includestdio.hintmain(){printf(%6.2f\n,0.5);return0;}// 输出为 0.50上⾯⽰例中 %6.2f 表⽰输出字符串最⼩宽度为6⼩数位数为2。所以输出字符串的头部有两个空格。6.3 最⼩宽度和⼩数位数这两个限定值都可以⽤ * 代替通过 printf() 的参数传⼊。#includestdio.hintmain(){printf(%*.*f\n,6,2,0.5);return0;}// 等同于printf(%6.2f\n, 0.5);上⾯⽰例中 %*.*f 的两个星号通过 printf() 的两个参数 6 和 2 代⼊。7、显示正负号默认情况下 printf() 不对正数显⽰ 号只对负数显⽰ - 号。如果想让正数也输出 号可以在占位符的 % 后⾯加⼀个 。#includestdio.hintmain(){printf(%d\n,12);// 输出 12printf(%d\n,-12);// 输出 -12return0;}二、scanf当我们有了变量我们需要给变量输⼊值就可以使⽤ scanf 函数如果需要将变量的值输出在屏幕上的时候可以使⽤ printf 函数如:#includestdio.hintmain(){intscore0;printf(请输⼊成绩:);scanf(%d,score);printf(成绩是%d\n,score);return0;}画图演示1、scanf的基本用法1.1 scanf() 函数⽤于读取⽤⼾的键盘输⼊。程序运⾏到这个语句时会停下来等待⽤⼾从键盘输⼊。⽤⼾输⼊数据、按下回⻋键后 scanf() 就会处理⽤⼾的输⼊将其存⼊变量。它的原型定义在头⽂件stdio.h 。scanf(%d,i);它的第⼀个参数是⼀个格式字符串⾥⾯会放置占位符与 printf()的占位符基本⼀致告诉编译器如何解读⽤⼾的输⼊需要提取的数据是什么类型。它的其余参数就是存放⽤⼾输⼊的变量格式字符串⾥⾯有多少个占位符就有多少个变量。上⾯⽰例中 scanf() 的第⼀个参数 %d 表⽰⽤⼾输⼊的应该是⼀个整数。%d 就是⼀个占位符% 是占位符的标志 d 表⽰整数第⼆个参数 i 表⽰将⽤⼾从键盘输⼊的整数存⼊变量i 。注意变量前⾯必须加上 运算符指针变量除外因为 scanf() 传递的不是值⽽是地址即将变量 i 的地址指向⽤⼾输⼊的值。如果这⾥的变量是指针变量⽐如字符串变量那就不⽤加 运算符。1.2 下面是一次将键盘输入读入多个变量的例子scanf(%d%d%f%f,i,j,x,y);上⾯⽰例中格式字符串 %d%d%f%f 表⽰⽤⼾输⼊的前两个是整数后两个是浮点数⽐如 1 -20 3.4 -4.0e3。这四个值依次放⼊ i 、 j 、 x 、 y 四个变量。scanf()处理数值占位符时会⾃动过滤空⽩字符包括空格、制表符、换⾏符等。-1.3 所以⽤⼾输⼊的数据之间有⼀个或多个空格不影响 scanf() 解读数据。另外⽤⼾使⽤回⻋键将输⼊分成⼏⾏也不影响解读。1-203.4-4.0e3上⾯⽰例中⽤⼾分成四⾏输⼊得到的结果与⼀⾏输⼊是完全⼀样的。每次按下回⻋键以后scanf() 就会开始解读如果第⼀⾏匹配第⼀个占位符那么下次按下回⻋键时就会从第⼆个占位符开始解读。1.4 scanf() 处理⽤⼾输⼊的原理是⽤⼾的输⼊先放⼊缓存等到按下回⻋键后按照占位符对缓存进⾏解读。#includestdio.hintmain(){intx;floaty;// ⽤⼾输⼊ -13.45e12# 0scanf(%d,x);printf(%d\n,x);scanf(%f,y);printf(%f\n,y);return0;}上⾯⽰例中 scanf() 读取⽤⼾输⼊时 %d 占位符会忽略起⾸的空格从 - 处开始获取数据读取到 -13 停下来因为后⾯的 . 不属于整数的有效字符。这就是说占位符 %d 会读到 -13 。第⼆次调⽤ scanf() 时就会从上⼀次停⽌解读的地⽅继续往下读取。这⼀次读取的⾸字符是 ’ .’ 由于对应的占位符是 %f 会读取到 .45e12 这是采⽤科学计数法的浮点数格式。后⾯的‘‘#’’不属于浮点数的有效字符所以会停在这⾥。1.4 由于 scanf() 可以连续处理多个占位符所以上⾯的例⼦也可以写成下⾯这样。#includestdio.hintmain()intx;floaty;// ⽤⼾输⼊ -13.45e12# 0scanf(%d%f,x,y);return0;}2、scanf的返回值2.1 scanf() 的返回值是⼀个整数表⽰成功读取的变量个数。如果没有读取任何项或者匹配失败则返回 0 。如果在成功读取任何数据之前发⽣了读取错误或者遇到读取到⽂件结尾则返回常量 EOF (-1)。EOF - end of file ⽂件结束标志#includestdio.hintmain(){inta0;intb0;floatf0.0f;intrscanf(%d %d %f,a,b,f);printf(a%d b%d f%f\n,a,b,f);printf(r %d\n,r);return0;}运行的结果2.2 如果输入2个数后(r 的值为2)按3次 ctrlz就会提前结束输入2.3 如果一个字都不输入直接按3次ctrlz则r的输出为-1即EOF:3、占位符%c 字符。%d 整数。%f float 类型浮点数。%lf double 类型浮点数。%Lf long double 类型浮点数。%s 字符串。%[] 在⽅括号中指定⼀组匹配的字符⽐如 %[0-9]遇到不在集合之中的字符匹配将会 停⽌。1上⾯所有占位符之中除了 %c 以外都会⾃动忽略起⾸的空⽩字符。 %c 不忽略空⽩字符总是返回当前第⼀个字符⽆论该字符是否为空格。2如果要强制跳过字符前的空⽩字符可以写成scanf( %c, ch) 即 %c 前加上⼀个空格表⽰跳过零个或多个空⽩字符。3特别说一下占位符 %s它其实不能简单地等同于字符串。它的规则是从当前第⼀个⾮空⽩字符开始读起直到遇到空⽩字符即空格、换⾏符、制表符等为⽌。4因为 %s 不会包含空⽩字符所以⽆法⽤来读取多个单词除⾮多个 %s ⼀起使⽤。这也意味着scanf() 不适合读取可能包含空格的字符串⽐如书名或歌曲名。另外 scanf() 遇到 %s 占位符会在字符串变量末尾存储⼀个空字符 \0 。5scanf() 将字符串读⼊字符数组时不会检测字符串是否超过了数组⻓度。所以储存字符串时很可能会超过数组的边界导致预想不到的结果。为了防⽌这种情况使⽤ %s 占位符时应该指定读⼊字符串的最⻓⻓度即写成 %[m]s 其中的 [m] 是⼀个整数表⽰读取字符串的最⼤⻓度后⾯的字符将被丢弃。#includestdio.hintmain(){charname[11];scanf(%10s,name);return0;}上⾯⽰例中 name 是⼀个⻓度为11的字符数组 scanf() 的占位符 %10s 表⽰最多读取⽤⼾输⼊的10个字符后⾯的字符将被丢弃这样就不会有数组溢出的⻛险了。4、赋值忽略符4.1 有的用户输入的是不符合预定的格式如果⽤⼾输⼊ 2020-01-01 就会正确解读出年、⽉、⽇。问题是⽤⼾可能输⼊其他格式⽐如 2020/01/01 这种情况下 scanf() 解析数据就会失败。#includestdio.hintmain(){intyear0;intmonth0;intday0;scanf(%d-%d-%d,year,month,day);printf(%d %d %d\n,year,month,day);return0;}运行结果4.2 为了避免这种情况 scanf() 提供了⼀个赋值忽略符assignment suppression character * 。只要把 * 加在任何占位符的百分号后⾯该占位符就不会返回值解析后将被丢弃。#includestdio.hintmain(){intyear0;intmonth0;intday0;scanf(%d%*c%d%*c%d,year,month,day);return0;}运行结果上⾯⽰例中 %*c 就是在占位符的百分号后⾯加⼊了赋值忽略符 *表⽰这个占位符没有对应的变量解读后不必返回。

相关文章:

【C语言】printf、scanf

上期回顾 【C语言】分支与循环—rand、srand、time 其他篇章 【C语言专栏】 其他专栏 【Linux专栏】 文章目录一、printf1、printf的基本用法:2、占位符3、常用占位符列举4、限定宽度5、输出部分字符串6、限定小数位数7、显示正负号二、scanf1、scanf的基本用法2、…...

别再死磕梯度下降了!用Python手写BFGS算法,5分钟搞定二次函数优化

别再死磕梯度下降!用Python手写BFGS算法,5分钟搞定二次函数优化 优化算法是机器学习和数据科学中的核心工具,而梯度下降可能是大多数人接触到的第一个优化方法。但当你开始处理更复杂的模型或更大规模的数据时,梯度下降的局限性就…...

【2026年华为留学生暑期实习-非AI方向(通软嵌软测试算法数据科学)-4月23日-第一题- 给软件版本号排序】(题目+思路+JavaC++Python解析+在线测试)

题目内容 给出一系列软件版本号,请以升序对其排序。 主版本号是由“.”分割的多组数字组成,另外在正式的 releasereleaserelease 版本之前还存在 betabeta...

Ceph块存储与对象存储实战指南

Ceph 分布式存储学习笔记(三):块存储和对象存储管理 Ceph 是一个开源的分布式存储系统,提供高性能、高可靠性和可扩展性。块存储(RBD)和对象存储(RGW)是 Ceph 的两种核心存储类型&a…...

Java高频面试考点场景题12

视频以 “银行网点” 类比,系统讲解了线程池的核心设计逻辑与面试高频考点,核心内容可总结为以下四部分:一、线程池的 “抠门” 原则线程池设计遵循 “能排队就不招临时工” 的反直觉原则:优先使用核心线程处理任务,队…...

别再傻傻用播放器看信息了!用ffprobe命令行5分钟搞定视频文件深度解析

别再傻傻用播放器看信息了!用ffprobe命令行5分钟搞定视频文件深度解析 每次拿到一个视频文件,你是不是也习惯性地双击用播放器打开,然后右键查看属性?这种方法虽然直观,但效率实在太低——尤其是当你需要批量检查视频参…...

WanVideo_Cofy:AI 驱动的开源专业级视频生成平台全解析

一、平台简介 WanVideo_Cofy(全称 WanVideo ComfyUI,常简称为 WanVideo_Cofy)是基于阿里云通义万相 Wan 2 系列视频生成模型(核心为 Wan 2.2)深度定制、依托 ComfyUI 可视化节点编辑器打造的开源 AI 视频生成一体化解…...

Phi-3.5-mini-instruct惊艳效果:中文技术术语与英文缩写双向精准映射

Phi-3.5-mini-instruct惊艳效果:中文技术术语与英文缩写双向精准映射 1. 模型概述与核心能力 Phi-3.5-mini-instruct是微软推出的轻量级开源指令微调大模型,在多项基准测试中表现优异。这个模型特别适合需要处理技术文档和跨语言术语映射的场景。 1.1…...

破壳记录(二)|头部、底部与登录模块:从业务组件到状态管理的工程化实践

本系列继续拆解网易云音乐仿写项目中的技术难点。上一篇我们聚焦配置层面的工程化(持久化、懒加载、TS 配置、代理),这一篇深入到业务组件与状态管理—— 头部导航、底部页脚、登录系统,看看它们如何体现数据驱动、CSS 工程化、异…...

Java 微服务架构:从拆分到治理的完整踩坑记录

一、为什么要写这篇文章做过 Java 转 Vue3 迁移的同学都知道——光看文档是不够的。文档告诉你 API 怎么用,但不会告诉你哪些"习惯性写法"在新框架里会悄悄出错,还不报错。本文来自真实迁移经历,整理了 6 类高频踩坑场景&#xff0…...

MinerU快速部署教程:3步搭建智能文档解析系统,支持OCR识别

MinerU快速部署教程:3步搭建智能文档解析系统,支持OCR识别 1. 引言:为什么你需要一个自己的文档解析助手 想象一下这个场景:你手头有一堆扫描的PDF合同、会议纪要的截图,或者一份满是表格和公式的学术论文。你需要快…...

别再乱配了!手把手教你搞定RK809 Codec的MIC差分与单端输入(附DTS配置避坑)

RK809 Codec硬件配置实战:从差分与单端输入原理到DTS避坑指南 在嵌入式音频系统开发中,RK809这颗高度集成的音频Codec芯片因其出色的性价比和丰富的功能接口,成为RK3568等主流嵌入式平台的首选音频解决方案。但许多开发者在实际调试过程中&am…...

Mac上VS Code配置PySide6开发环境:从Qt Designer拖拽到代码运行的全流程避坑指南

Mac上VS Code配置PySide6开发环境:从Qt Designer拖拽到代码运行的全流程避坑指南 在Mac环境下使用VS Code进行PySide6开发,可以享受到Qt Designer可视化设计工具带来的高效界面开发体验。不同于Windows系统的一键安装,MacOS特有的应用包结构和…...

数字化-两种基因,两种宿命

一个做汽配的人,为什么在研究瑞幸事情是这样的。我们公司内部有个群,有天晚上,有人甩了一个链接进来,是程前朋友圈讲瑞幸9块9咖啡怎么赚钱的那期。本来大家都在忙自己的事,没人点开。但技术负责人看完之后,…...

应对Turnitin严查:英文论文降AI率避坑指南,如何彻底告别“机器味”?

这两天在几个交流群里潜水,发现大家都在聊一件挺让人头疼的事。 明明是自己熬夜敲出来的英文初稿,丢进 Turnitin 一查,AI 率直接飙到 80% 以上,所以掌握科学降ai率方法是非常重要的。 最近各大检测系统都在疯狂升级算法&#xff…...

Phi-3-mini-128k-instruct镜像免配置亮点:预装vLLM 0.6.3+Chainlit 1.2.0+依赖全兼容

Phi-3-mini-128k-instruct镜像免配置亮点:预装vLLM 0.6.3Chainlit 1.2.0依赖全兼容 1. 模型简介 Phi-3-Mini-128K-Instruct是一个38亿参数的轻量级开放模型,属于Phi-3系列的最新成员。这个模型经过精心训练,使用了包含合成数据和精选公开网…...

jQuery Mobile 页面:深入理解与高效应用

jQuery Mobile 页面:深入理解与高效应用 引言 随着移动设备的普及,移动网页开发成为了前端开发的一个重要分支。jQuery Mobile 是一个流行的开源移动网页框架,它为开发者提供了一套完整的移动网页解决方案。本文将深入探讨 jQuery Mobile 页面的设计原理、实现方法以及在实…...

Real-Anime-Z入门指南:从服务器IP访问7860到生成首张图的5分钟全流程

Real-Anime-Z入门指南:从服务器IP访问7860到生成首张图的5分钟全流程 1. 项目概述 Real-Anime-Z是一款基于Stable Diffusion技术的2.5D风格图像生成模型,完美融合了写实质感与动漫美感。这个模型系列由23个LoRA变体组成,可以叠加在Z-Image基…...

CloudCompare点云配准结果不准?手把手教你用PCL代码复现并验证其指标

CloudCompare点云配准结果验证:用PCL代码复现核心指标的计算逻辑 当我们在CloudCompare中完成点云配准后,软件会给出"精度"和"重叠度"两个关键指标。但作为专业用户,你是否思考过这些数字背后的计算原理?本文…...

手把手教你用大疆M100和ZED相机搭建空地协同SLAM系统(附Gazebo仿真)

从零搭建空地协同SLAM系统:大疆M100与ZED相机的实战指南 当无人机与地面机器人开始共享同一张环境地图时,魔法就发生了。想象一下,无人机像鹰隼般俯瞰全局,地面机器人则如猎犬般细致探索——这正是协同SLAM技术的魅力所在。本文将…...

当AI阅读‘动物园怪谈’:用GPT-4分析规则矛盾与逻辑漏洞,我们能学到什么?

当AI阅读‘动物园怪谈’:用GPT-4分析规则矛盾与逻辑漏洞,我们能学到什么? 深夜的实验室里,我将这份被称为"动物园怪谈"的诡异文档完整输入GPT-4的对话框。屏幕上跳动的光标仿佛在呼吸,等待AI给出它的解读。这…...

JDK20安装后,除了‘Hello World’还能怎么玩?用VSCode快速搭建你的第一个Java项目

JDK20安装后,除了‘Hello World’还能怎么玩?用VSCode快速搭建你的第一个Java项目 当你成功安装JDK20并验证了环境变量配置后,打印"Hello World"可能已经无法满足你的探索欲望。作为现代Java开发者,我们更渴望立即投入…...

不只是抓包:用Fiddler在Android上‘伪造’数据,快速测试App的边界与异常场景

不只是抓包:用Fiddler在Android上‘伪造’数据,快速测试App的边界与异常场景 在移动应用测试领域,大多数工程师对Fiddler的认知停留在"抓包工具"层面——它能记录HTTP/HTTPS请求,帮助分析网络交互。但鲜有人意识到&…...

CentOS 8停服后,yum install报错‘Could not resolve host’的终极修复手册(附阿里云源修正)

CentOS 8停服后yum源失效的深度修复指南:从原理到实战 当你在终端输入yum install命令后看到Could not resolve host的红色报错时,这不仅仅是简单的网络问题——它标志着CentOS 8生命周期结束(EOL)带来的连锁反应正在影响你的系统。作为仍在维护CentOS 8…...

别再手动模拟时序了!深入理解STM32 FSMC如何“硬件级”简化外部SRAM访问

深入解析STM32 FSMC:硬件级SRAM访问优化实践 在嵌入式系统开发中,内存资源常常成为限制项目复杂度的瓶颈。当STM32内部SRAM不足以支撑大型应用时,外部SRAM扩展成为必选项。传统GPIO模拟时序的方法不仅代码臃肿,还存在性能瓶颈。本…...

从WiFi到SDR:如何为你的机器人集群挑选合适的“数传”硬件?(避坑指南与组网实测)

从WiFi到SDR:机器人集群通信硬件选型实战手册 当二十台自主移动机器人需要在500米半径的仓库内同步位置数据时,WiFi模块频繁掉线;当野外搜救集群需要跨越3公里峡谷传输高清图像时,常规数传模块集体失联——这些真实场景暴露出机器…...

系统运维实战:journalctl日志分析与故障排查指南

1. journalctl基础:从零开始掌握日志分析 刚接触Linux系统运维时,最让我头疼的就是排查系统问题。每次服务器出状况,面对/var/log下密密麻麻的日志文件总是一头雾水。直到发现了journalctl这个神器,我的运维效率直接翻倍。journal…...

Real Anime Z企业级运维:Prometheus+Grafana显存/延迟/吞吐量监控

Real Anime Z企业级运维:PrometheusGrafana显存/延迟/吞吐量监控 1. 项目背景与监控需求 Real Anime Z是基于阿里云通义Z-Image底座模型开发的高精度二次元图像生成工具,其核心特性包括BF16稳定精度、智能权重注入和双层显存优化方案。在企业级部署场景…...

以学代练:用竞赛真题学算法——二叉树

先上题目,出自蓝桥杯省赛真题题目描述给定一棵包含 N 个节点 的完全二叉树,树上每个节点都有权值。节点按照从上到下、从左到右的顺序依次编号为 A1​,A2​,…,AN​。现在需要把同一深度(同一层)的所有节点权值相加,求…...

避坑指南:ArcGIS中管网流向设置总出错?可能是你的‘源’和‘汇’用错了

ArcGIS管网流向分析:从原理到实践的深度避坑指南 在市政管网或河网分析中,流向判断是网络分析的基础,却也是许多GIS工程师踩坑的重灾区。你是否遇到过这样的场景:精心构建的几何网络,在执行流向分析时频繁报错&#xf…...