c语言中的printf和scanf

一.printf函数(使用前需要头文件stdio.h)

用法:printf()作用将参数文本输出到屏幕。

不会在行尾自动添加换行符,运行结束后,光标会停留在输出结束的位置。

占位符:所在位置能被后面的值给代替,如:%d  %f  %c

67a7b38d91b346dd9727b6dfb3fd0c61.png

注意:%s限定了后面的参数必须是字符串,%d限定了后面的参数必须是整数

假设占位符的个数为n,那么参数个数则必须为n+1。

如上图:占位符有2个,为%s %d;参数有3个,为“xiaoming”  18  “%s is %d years old”

那如果参数个数少于占位符个数会咋样呢?

9c40b4ffdf614f83ae676bb5c6d3fadd.png

printf将会随机打印存储在内存中的值

常见占位符:

%d%c%s%f%lf%Lf%x%u%lu%ld%hd%hu%zd
十进制整数字符字符串小数(float或double)doublelong long double十六进制整数unsigned intunsigned long int十进制long int十进制short intunsigned short intsizeof返回值

输出格式:

1.限定宽度,在%后加数字即可(数字可正也可负)

ca8d758cb35646aea05b9470838bc6eb.png

e3c6068cb66e4301a97fa1e87ba0a2ad.png

%10s表示这个占位符的宽度至少是10位,若参数位数不满10,则在其前面添加空格;若参数位数>=10,则不添加空格

00854cd65afe4a97b597f072d32dab0a.png

%-10s,若参数位数不满10,则在其后面添加空格;若参数位数>=10,也不会添加空格

2.限定小数位数,在%后加.数字即可

87289a9cca284cba966a74a3af9acc83.png

10限制了小数要保留的位数

e3ffaf46101c4757b60e8b2c8a9eed5b.png

在限定位数时,会将值四舍五入

----我们还可以通过*来实现限定

be0a6a16cee94f05aa372a920dfc70b2.png

10限定宽度,6限定保留位数。

3.如何打印出一个+6

7df2af38294548ed9db4bef4ed544785.png

4.输出部分字符串(%.[m]s),[m]代表数字

59e4e065ab6b466585ace94566949a50.png

3表示只输出“abcdef”的前三个字符

二.scanf(使用前需包含头文件stdio.h)

用于读取用户输入的值,当运行到scanf语句时,程序会停下来,等待用户输入,输入的值会放入缓存中,当按下回车键后,才会将值存储在变量中

0b07070f1a4a49efb299d8289ab17a21.png

%d表示用户输入的必须是一个整数,&a表示将输入的值存入变量a中

注意:占位符的选择需与前面创建变量的类型保持一致,占位符个数与变量个数一致

scanf处理用户输入的原理:首先用户输入的值会放在缓存中,按下回车键后,scanf会根据占位符来读取缓存中的值,读取时会从上一次读取遗留的第一个字符开始,直到读完缓存,或遇到第一个不符条件的字符为止。(直白点就是,若读取到与占位符不相关的,则会停止在这,后面的值不在读取,读取失败的会被赋于0)

95464e5d6c4b424fb28371799db67e15.png

这里可以解释一下上面的原理,输入了以上数据,scanf根据%d读取到第一个数字2,并把它存入变量a中,数字4也是这样存入到b中,然而到第三个占位符%f时,scanf应该读取的是一个小数,而存入缓存中的是a,遇到第一个不符条件的字符,停止读取,并返回0

7c93e19c185c484f9feee694a2b027f2.png

在处理数值占位符时,会自动过滤空格,制表符,换行符等。

scanf读取%c类型的:

919513268f72433fb42234b70f5685f4.png

f70b3b4ac1b54ea28df50d9409b8b418.png

可以看到%c不能自动空滤空格,制表符,换行符等

但有一个办法,即在%c前面加一个空格,它就会过滤了

65838c0f926f4273874219b37ca054a1.png

scanf读取%s类型的:

原则:从第一个非空白字符读取,直到遇到空格,制表符,换行符等为止

939a64138dc84206ba7cc68a4284d7e5.png

可以看到,遇到空格后不在读取之后的

但是这里也有一个办法可以含空格的字符串   %[^\n]s 意思是一直读取,直到遇到\n

8176e82004f64b44a7f0d74744880999.png

scanf遇到%s的时候,会在字符串末尾加一个\0

859de8b5a72e450bbe3cfb01f3f1e58f.png

scanf将字符串读入到数组中时,它不会检测是否超过了数组长度,这样就有可能越界

方法:我们可以指定读入字符的个数,%[m]s  [m]代表一个数字

fbc0cdbe7e5e4c79ba0e5f20600641fd.png

9代表scanf最多只读取9个字符

这里我们要注意一下:9不能换成10,原因是10个元素中存放了一个\0,最多只能读取9个,否则会造成越界

若输入的字符个数少于限定值,那会全部读取输入

23d3e3524bab41c8948a5cf680319bf4.png

scanf的返回值:是一个整数,表示成功读取到的个数

  如果没有读取任何项,则返回0

  如果在读取之前,发生了读取错误,则返回EOF(-1)  在vs环境中要按三次ctrl+z键

我们用r接收scanf成功读取到的个数

dc3d39b2940e4fb5959b089ad168e83f.png

6fea86e7a6e14ee6ae374465d59b08e3.png

5fe1a816c9e54c1aa14b191bb00d150c.png

3b9d856767204060b3dace881cb9fdd8.png

这里提一下,当我们在网上做题时常常出现“多组输入”这个词,若直接用scanf则不能实现,需要用到循环

#include<stdio.h>

int main()
{
    int a = 0;
    while(scanf("%d",&a)!=EOF)
    {
         //这里面放代码
    }
}

解释一下while里面:scanf()!=EOF就是scanf的返回值若不等于-1,也就是成功读取的话,它就会一直循环下去让你输入

赋值忽略符:

有时,我们在输入数据的时候可能和预定格式不同(也就是我们输入的数据中有与占位符不相匹配的字符)

fc05721e5d3444b78399e3486a59491c.png

预定格式也就是在“ ”里占位符之间的位置。若两个占位符之间没有空格,但我们在输入的时候添加空格不影响scanf读取到的值

7fca7d70bb32434ba17f64bba35869d5.png

我们可以在占位符之间添加%*c即可过滤掉不必要的字符,但是在图中只能过滤一个不必要的字符

我们可能会想到多添加几个%*c就能过滤多个不必要的字符了,这也是可行的

但是若你添加了两个%*c,而在输入的时候只有一个不必要的字符,它会往后再次过滤一个,如图:

-----兄弟们,多多支持一下,感谢你们

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值