目录
1. 前情引入
在大家初步学习C语言的时候,想必最先认识的就是printf和scanf这两个库函数
但关于这两个函数的隐藏知识点,你真的完全掌握了吗?学完之后可以拿去拷打你的室友
以下知识点满分的评论区请扣1,暂未完全掌握的请扣0
2. printf隐藏知识点
2.1 各种占位符
printf库函数全名为print format(打印格式化)先介绍一些常见占位符
%c:字符
%f:小数
%hd:十进制short int类型
%hu:unsigned short int类型
%ld:十进制long int类型
%lu:unsigned long int类型
%Lf:long double类型浮点数(特别注意这里的L是大写)
%p:指针
%u:unsigend int类型
%x:十六进制整数
%zd:size_t类型
2.2 限定最小宽度
在我们使用printf打印的时候,我们可以在占位符的%后面加上数字,便可以实现限定打印出的占位符的最小宽度
从上图很明显可以看出,第二行前面空出了两个数字的位置,这是因为%5d就说明占位符打印的最小宽度就要是五位,如果不满五位,那便会在前面添加对应的空格
注意:正常输出的值是默认向右对齐的,也就是在左边添加空格
那我们有没有办法让输出的值向左对齐呢???
如上图所示,我们可以通过在%后面加上一个负号,那么就可以让输出内容从左对齐
2.3 显示正负号
在printf打印的时候,一般默认正数是不会带上正号的
同样是在%后面加上正号,这样不管是打印正数还是负数,结果都会显示正负号
2.4 限定小数位数
当我们想要限制printf打印出来的小数的位数,比如希望只保留两位小数,那我们的占位符可以写成%.2f
你会发现明明是五位小数,但根据所加的限制,只能输出两位小数
那大家可能想问这种限制支持不支持四舍五入呢???可以自己敲代码实践一下
上面这种写法可以与限制宽度结合到一起
能够很清楚的发现,上面既限制了小数位数,又限制了打印的字符宽度,写成%9.2f的占位格形式,就代表是打印出九个单位长度,同时只打印两位小数
2.5 用星号代替参数传入
在上面介绍的最小宽度和小数位数两个限定值,都可以用*代替
你会发现用*代替的结果跟正常输出是一样的
2.6 输出部分字符串
我们知道要输出字符串,需要使用占位符%s,取自于字符串的英文(string)
但那样是会将字符串全部打印,那有没有办法只打印部分字符串呢???
可以用%.[m]s的格式指定打印的字符串长度
[m]代表一个数字,输入几就代表限制了打印多少长度的字符串,就可以实现只打印部分字符串的功能了
3. scanf隐藏知识点
基本用法:scanf()函数用于读取用户的键盘输入
当程序运行到这个语句的时候,程序便会停下来不再向下进行,等待用户输入值
它的头文件与printf相同都是#include<stdio.h>
scanf()处理用户输入的原理是,用户的输入值先放入缓存,等到按下回车键后,按照占位符,依次对缓存进行解读
3.1 过滤空白字符
scanf会自动过滤空白字符,包括空格,制表符,换行符等等
所以用户在输入的每个数据之间无论有多少个空格或者其他空白字符,都不会影响scanf函数解读数据,这个很容易理解,待会大家可以自己去敲代码验证一下,这里就不举例说明了
3.2 遇到第一个不符合条件的字符停止读取
scanf在连续读取数据的时候碰到第一个不符合条件的字符停止读取
输入13.25,但因为scanf输入的是整型类型的变量,所以只识别到13,后面为错误识别,scanf函数便会停止读取后面的数据
3.3 scanf的返回值
scanf的返回值为一个整数,表示成功读取的变量个数,如果没有读取任何项,或者匹配失败,则返回0
如果在成功读取到数据前,发生了读取错误,则返回常量EOF(-1)
EOF:end of file文件结束标志
由上图可以看出scanf返回值(输入的变量个数)是3,对应输入了三个变量
那什么情况下会返回EOF呢?
我们可以输入ctrl+z,这样相当于没有输入
如图,使用了三次Ctrl+z后,scanf的返回值变成了EOF(-1)
3.4 特殊的%c和%s
%c不会忽略空白字符,因为空格本身也就是一个字符,所以用%c输入的时候,空格也会被识别
如上图scanf输入的第一个是空格,那么返回第一个字符也就是空格
还有%s,%s是不会包含空白字符的
scanf中读取%s(字符串)是从第一个非空白字符开始读起,直到遇见空白字符(即空格,换行符,制表符等)才会停止读取
所以scanf函数不适合用来读取包含空格的字符串,比如书名或歌曲名
3.5 控制读取字符串最大长度
在我们后面学到数组的时候,scanf会将字符串读入字符数组中,为了控制读取字符串最大长度,防止读取的字符串长度超过了我们所创建的数组空间,所以我们可以通过写成%[m]s,[m]就是数字,代表读取的字符串最大长度,如下图
3.6 赋值忽略符
有时候,我们用户输入的值可能不符合预定的格式
那我们就可以使用赋值忽略符,%*c的形式
%*c就是在占位符的百分号后面,加上了赋值忽略符*,表示这个占位符没有对应的变量,解析之后不需要返回