一.printf函数(使用前需要头文件stdio.h)
用法:printf()作用将参数文本输出到屏幕。
不会在行尾自动添加换行符,运行结束后,光标会停留在输出结束的位置。
占位符:所在位置能被后面的值给代替,如:%d %f %c
注意:%s限定了后面的参数必须是字符串,%d限定了后面的参数必须是整数
假设占位符的个数为n,那么参数个数则必须为n+1。
如上图:占位符有2个,为%s %d;参数有3个,为“xiaoming” 18 “%s is %d years old”
那如果参数个数少于占位符个数会咋样呢?
printf将会随机打印存储在内存中的值
常见占位符:
%d | %c | %s | %f | %lf | %Lf | %x | %u | %lu | %ld | %hd | %hu | %zd |
十进制整数 | 字符 | 字符串 | 小数(float或double) | double | long long double | 十六进制整数 | unsigned int | unsigned long int | 十进制long int | 十进制short int | unsigned short int | sizeof返回值 |
输出格式:
1.限定宽度,在%后加数字即可(数字可正也可负)
%10s表示这个占位符的宽度至少是10位,若参数位数不满10,则在其前面添加空格;若参数位数>=10,则不添加空格
%-10s,若参数位数不满10,则在其后面添加空格;若参数位数>=10,也不会添加空格
2.限定小数位数,在%后加.数字即可
10限制了小数要保留的位数
在限定位数时,会将值四舍五入
----我们还可以通过*来实现限定
10限定宽度,6限定保留位数。
3.如何打印出一个+6
4.输出部分字符串(%.[m]s),[m]代表数字
3表示只输出“abcdef”的前三个字符
二.scanf(使用前需包含头文件stdio.h)
用于读取用户输入的值,当运行到scanf语句时,程序会停下来,等待用户输入,输入的值会放入缓存中,当按下回车键后,才会将值存储在变量中
%d表示用户输入的必须是一个整数,&a表示将输入的值存入变量a中
注意:占位符的选择需与前面创建变量的类型保持一致,占位符个数与变量个数一致
scanf处理用户输入的原理:首先用户输入的值会放在缓存中,按下回车键后,scanf会根据占位符来读取缓存中的值,读取时会从上一次读取遗留的第一个字符开始,直到读完缓存,或遇到第一个不符条件的字符为止。(直白点就是,若读取到与占位符不相关的,则会停止在这,后面的值不在读取,读取失败的会被赋于0)
这里可以解释一下上面的原理,输入了以上数据,scanf根据%d读取到第一个数字2,并把它存入变量a中,数字4也是这样存入到b中,然而到第三个占位符%f时,scanf应该读取的是一个小数,而存入缓存中的是a,遇到第一个不符条件的字符,停止读取,并返回0
在处理数值占位符时,会自动过滤空格,制表符,换行符等。
scanf读取%c类型的:
可以看到%c不能自动空滤空格,制表符,换行符等
但有一个办法,即在%c前面加一个空格,它就会过滤了
scanf读取%s类型的:
原则:从第一个非空白字符读取,直到遇到空格,制表符,换行符等为止
可以看到,遇到空格后不在读取之后的
但是这里也有一个办法可以含空格的字符串 %[^\n]s 意思是一直读取,直到遇到\n
scanf遇到%s的时候,会在字符串末尾加一个\0
scanf将字符串读入到数组中时,它不会检测是否超过了数组长度,这样就有可能越界
方法:我们可以指定读入字符的个数,%[m]s [m]代表一个数字
9代表scanf最多只读取9个字符
这里我们要注意一下:9不能换成10,原因是10个元素中存放了一个\0,最多只能读取9个,否则会造成越界
若输入的字符个数少于限定值,那会全部读取输入
scanf的返回值:是一个整数,表示成功读取到的个数
如果没有读取任何项,则返回0
如果在读取之前,发生了读取错误,则返回EOF(-1) 在vs环境中要按三次ctrl+z键
我们用r接收scanf成功读取到的个数
这里提一下,当我们在网上做题时常常出现“多组输入”这个词,若直接用scanf则不能实现,需要用到循环
#include<stdio.h>
int main()
{
int a = 0;
while(scanf("%d",&a)!=EOF)
{
//这里面放代码
}
}
解释一下while里面:scanf()!=EOF就是scanf的返回值若不等于-1,也就是成功读取的话,它就会一直循环下去让你输入
赋值忽略符:
有时,我们在输入数据的时候可能和预定格式不同(也就是我们输入的数据中有与占位符不相匹配的字符)
预定格式也就是在“ ”里占位符之间的位置。若两个占位符之间没有空格,但我们在输入的时候添加空格不影响scanf读取到的值
我们可以在占位符之间添加%*c即可过滤掉不必要的字符,但是在图中只能过滤一个不必要的字符
我们可能会想到多添加几个%*c就能过滤多个不必要的字符了,这也是可行的
但是若你添加了两个%*c,而在输入的时候只有一个不必要的字符,它会往后再次过滤一个,如图:
-----兄弟们,多多支持一下,感谢你们