printf![](https://img-blog.csdnimg.cn/9f2b277ba6014dd59f44f999339ae888.png)
正负号
默认情况下,
printf()
不对正数显⽰ +
号,只对负数显⽰
-
号。如果想让正数也输出
+
号,可
以在占位符的
%
后⾯加⼀个
+
。%后面加-代表左对齐。
限定宽度
printf()
允许限定占位符的最⼩宽度。
⽰例中,
%5d
表⽰这个占位符的宽度⾄少为5位。如果不满5位,对应的值的前⾯会添加空格。超过5位,数值全部输出。
输出的值默认是右对⻬,即输出内容前⾯会有空格;如果希望改成左对⻬,在输出内容后⾯添加空
格,也可以在占位符的
%
的后⾯插⼊⼀个
-
号。
限定⼩数位数
⽰例中,
%7.1lf
表⽰输出字符串最⼩宽度为7,⼩数位数为1,小数点占一位。所以,输出字符串的头部有两个空格。
最⼩宽度和⼩数位数这两个限定值,都可以⽤
*
代替,通过
printf()
的参数传⼊
⽰例中,
%*.*f
的两个星号通过
printf()
的两个参数 9
和 4
传⼊。
输出部分字符串
%s
占位符⽤来输出字符串,默认是全部输出。如果只想输出开头的部分,可以⽤
%.[m]s
指定输出的⻓度,其中 [m]
代表⼀个数字,表⽰所要输出的⻓度。
scanf
基本⽤法
scanf()
函数⽤于读取⽤⼾的键盘输⼊。
程序运⾏到这个语句时,会停下来,等待⽤⼾从键盘输⼊。
⽤⼾输⼊数据、按下回⻋键后,
scanf()
就会处理⽤⼾的输⼊,将其存⼊变量。
它的原型定义在头⽂件
stdio.h
。
注意:变量前⾯必须加上
&
运算符(指针变量除外),因为
scanf()
传递的不是值,⽽是地址,
即将变量
i
的地址指向⽤⼾输⼊的值。
如果这⾥的变量是指针变量(⽐如字符串变量),那就不⽤加
&
运算符。
scanf()
处理数值占位符时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等。
![](https://img-blog.csdnimg.cn/3208064b3cd84af59ac557785ef8a308.png)
scanf()
处理⽤⼾输⼊的原理是,⽤⼾的输⼊先放⼊缓存,等到按下回⻋键后,按照占位符对缓存
进⾏解读。
![](https://img-blog.csdnimg.cn/097f325d84594075ba25fba0686c5af5.png)
scanf()的返回值
scanf()
的返回值是⼀个整数,表⽰成功读取的变量个数。
如果没有读取任何项,或者匹配失败,则返回
0
。如果在成功读取任何数据之前,发⽣了读取错误或者遇到读取到⽂件结尾,则返回常量 EOF(-1)。
![](https://img-blog.csdnimg.cn/3968875915a442d0aab25adbc28bfd0c.png)
如果输⼊2个数后,按
ctrl+z
,提前结束输⼊:
![](https://img-blog.csdnimg.cn/b75314082b9942d78c742e1b28cede99.png)
在VS环境中按3次
ctrl+z
,才结束了输⼊,我们可以看到r是2,表⽰正确读取了2个数值。
如果⼀个数字都不输⼊,直接按3次
ctrl+z
,输出的r是-1,也就是EOF
![](https://img-blog.csdnimg.cn/e7a384cc7fc844dba30f709e2c568abc.png)
scanf()中的占位符
% 是占位符的标志
•
%c
:字符。
•
%d
:整数。
•
%f
:
float
类型浮点数。
•
%lf
:
double
类型浮点数。
•
%Lf
:
long double
类型浮点数。
•
%s
:字符串
•
%[]
:在⽅括号中指定⼀组匹配的字符(⽐如
%[0-9]
),遇到不在集合之中的字符,匹配将会
停⽌。
上⾯所有占位符之中,除了
%c
以外,都会⾃动忽略起⾸的空⽩字符。
%c
不忽略空⽩字符,总是返回当前第⼀个字符,⽆论该字符是否为空格。
![](https://img-blog.csdnimg.cn/7470214b3bbc40edadc6e922acca2ede.png)
如果要强制跳过字符前的空⽩字符,可以写成
scanf(" %c", &ch)
,即
%c
前加上⼀个空格,表
示跳过零个或多个空⽩字符。
![](https://img-blog.csdnimg.cn/023f5552f43e459a874383e06d9b0856.png)
%s
,它其实不能简单地等同于字符串。它的规则是,从当前第⼀个⾮空⽩字符开始读起,直到遇到空⽩字符(即空格、换⾏符、制表符等)为⽌
%s
不会包含空⽩字符,所以⽆法⽤来读取多个单词,除⾮多个
%s
⼀起使⽤。这也意味着,
scanf()
不适合读取可能包含空格的字符串,⽐如书名或歌曲名。另外,
scanf()
遇到
%s
占位
符,会在字符串变量末尾存储⼀个空字符
\0
![](https://img-blog.csdnimg.cn/68999616da0147908e523635179da2f4.png)
scanf()
将字符串读⼊字符数组时,不会检测字符串是否超过了数组⻓度。所以,储存字符串时,
很可能会超过数组的边界,导致预想不到的结果。为了防⽌这种情况,使⽤
%s
占位符时,应该指定 读⼊字符串的最⻓⻓度,即写成 %.[m]s
,其中的
[m]
是⼀个整数,表⽰读取字符串的最⼤⻓度,后⾯的字符将被丢弃。
赋值忽略符
⽰例中,如果⽤⼾输⼊ 23-11-18
,就会正确解读出年、⽉、⽇。问题是⽤⼾可能输⼊其他
格式,⽐如 23.11.18
,这种情况下,
scanf()
解析数据就会失败。
![](https://img-blog.csdnimg.cn/7f3fe62061d840d888250155381d7c9f.png)
![](https://img-blog.csdnimg.cn/e863d93bb1df44779efe70bf1e58c3ee.png)
为了避免这种情况,
scanf()
提供了⼀个赋值忽略符(assignment suppression character)
*
。
表⽰这个占位符没有对应的变量,解读后不必返回,只要把 *
加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃
![](https://img-blog.csdnimg.cn/92900fa2916a49eabf9766c51f646a4f.png)