
🎬个人主页:缘三水的博客
❄专栏传送门:C语言专栏(新手向)
人生格言:行动是迷茫的最好解药
🎬个人介绍:

文章目录
- 正文
- [(一) printf](#(一) printf)
- (二)scanf
-
- [2.1 基本用法](#2.1 基本用法)
- [2.2 scanf返回值](#2.2 scanf返回值)
- [2.3 占位符](#2.3 占位符)
- [2.4 赋值忽略符*](#2.4 赋值忽略符*)
- 总结
正文
(一) printf
1.用法
printf是用来打印文本到屏幕上的库函数
print意思是打印 f是format意思是格式化
需要包含头文件#include <stdio.h>
基本语法形式是:printf("需要打印的文本");
值得注意的是printf在打印文本的时候无法进行自动换行需要我们手动添加一个\n
下面我分别展示未添加\n的和添加\n的输出情况
1.未添加\n

2.添加\n

通过比较我们发现\n在printf中充当换行符的作用
而\n的位置也可以变换,在文本中或文本开头

2.占位符
占位符在printf中有着关键作用
当我们想在一个地方打印数或字符或字符串,但还没确定好填入什么,可以先占一个位置(类比占座),在这之后再填入我们想要填的内容,这个时候就能用到我们的占位符了
2.1 占位符格式
%_(下划线上填入对应内容的数据类型)
比如:%d对应整数类型,%s对应字符串类型,%f对应浮点数类型
2.2 多个占位符的使用
占位符在printf中的实际使用语法格式
c
printf("包含占位符的打印文本", 对应占位符内容1, 对应占位符内容2,......);
这里需要注意
可以同时使用多个占位符,但占位符对应的内容需要按打印文本中的顺序一一填入

如图,第一个占位符是%s字符串类型,我们第一个内容就是字符串类型"zhangsan"
值得注意的是,在我们填入字符串内容是需加上" "的
再往后是%d整数类型,我们第二个内容填入的就是整数3
printf中参数和占位符是一一对应的,有n个占位符就会有n+1个参数
这里要打印的文本也算一个参数,所以参数是n+1个
如果输入的参数少于对应占位符个数,则会打印出内存中的任意值
2.3 常见占位符介绍
除了我们介绍的
%d:十进制整数类型 //int
%s:字符串类型
%f:浮点数类型(已经可以包含float和double类型)
倘若要细分则//float--%f //double--%lf
以下我再列举常见的占位符
%c:字符类型 //char
%hd:short int类型
%hu:unsigned short int类型
%ld:long int类型
%lu:unsigned long int类型
%Lf:long double类型
%p:指针(用于打印地址)
%u:无符号整数类型//unsigned int
%x:十六进制整数类型
%zd:size_t类型
3.限定输出格式
3.1 限定正负号
一般如果数是整数前面的正号+一般不显示
但我们想规定一个占位符对应参数的正负号,可以在%前加上±正负号,这样就能实现总是显示正负号
比如printf("+%d", 99); 打印出+99
比如printf("-%d", 99); 打印出-99
3.2 限定输出宽度
如果我们想对打印出内容的宽度格式有所要求
那我们可以在%_的下划线对应数据类型前加上数字,表示限定的宽度
1.右对齐
比如:printf("%5d", 999); 则会打印出空格空格999

原因是我们限定输出宽度为5,而我们输入的数只有999三个数
因此,在开头添加上两个空格
为什么不是在末尾加空格,因为这样输出默认右对齐,即在开头补上空格
2.左对齐
我们也可以在5d前加上负号- 实现左对齐
像这样:printf("%-5d", 999); 打印出来就是999空格空格

这里我用xxx作为参照说明是左对齐
3.3 限定小数位数
一般浮点型默认是打印小数点后六位
- 想限定小数位数可以:
c
printf("%.2f", 1.6789)//打印结果为1.68
小数点后的数字是限定的小数位数
限定小数位会进行四舍五入
- 限定小数位数可以与限定输出宽度连用
c
printf("5.2f",1.6789);//打印结果为空格1.68
这里的小数点也算一个输出宽度
输出宽度和小数位数可以用*占位,在printf后的参数导入
c
printf("*.*f", 5,2,1.6789);//打印结果为空格1.68
3.4 限定字符串长度
c
printf("%.5s\n","hello world");//打印出hello
格式
"% . 数字"
数字表示限定打印的字符串长度
%.5s表示限定5个字符串长度
(二)scanf
在我们创建变量之后
倘或需要给变量输入值,就可以使用scanf库函数
scanf的用法类似printf
只不过scanf是输入
printf是输出
2.1 基本用法
scanf头文件与printf一致
c
#include <stdio.h>
c
int a = 0;
scanf("%d", &a);
一般我们要给变量输入值就按照这个方式
(1)scanf参数解读
scanf函数的第一个参数是格式字符串
格式字符串里存放占位符(与printf占位符基本一致)
%d就是告诉会输入一个整型的数据
其他的参数存放要输入值的变量,占位符和变量一一对应
格式:&+变量名
&a,&是"取地址"在学习指针时会介绍
&a就是将输入的值存放到变量a中
注意:变量前必须加上&(指针变量如字符串除外)
因为scanf传递的不是值而是地址,利用&取地址
(2)多个占位符情况
scanf也可以使用多个占位符
c
scanf("%d%d%f%f",&i,&j,&x,&y);
在用户输入值之后
处理数据时,按照占位符,scanf函数可能 会自动过滤 空格,换行符,制表符
c
输入
1
2
2.3
4.5
scanf会过滤换行,处理数据
(3)scanf处理数据原理
实际在用户输入一连串数据后,这些数据会先放入缓存 当中
直到按下回车键,开始根据占位符一一解读
c
int main()
{
int x = 0;
float y = 0.0f;
scanf("%d%f", &x, &y);//输入 -13.45e12# 0
printf("%d\n%f\n",x,y);
return 0;
}

对于打印的结果我们来进行解读
首先我们输入了" -13.45e12# 0"
会将输入的值先放入缓存中
根据占位符进行解读
第一个占位符%d
所以会过滤掉前面的空格,直到读取到-13,读取到小数点时不符合%d对应类型停止读取,所以会打印-13
第二个占位符%f
需要读取浮点型
此时从剩下的数据".45e12# 0"读取
读取到.45e12结束,#不符合%f对应类型
注:这里的e12是0.45*10的12次方的意思,是科学计数法
又因为浮点型在内存中的存储是有误差的
因此会打印出449999994880.000000
其实没有e12数据的误差比较小,只是通过e12将这个误差放大了
2.2 scanf返回值
scanf的返回值是成功读取到变量的个数
没有读取到任何数,返回0
读取错误或读取到文件末尾,返回常量EOF(-1)
==EOF指的是end of file文件结束
c
int a = 0;
int b = 0;
float f = 0.0f;
int r = scanf("%d %d %f", &a, &b, &f);
printf("a=%d b=%d f=%f\n", a, b, f);
printf("r = %d\n", r);


如果我们连续输入三次ctrl+z则会停止读取
如上图,此时返回值为2,表示成功读取两个变量

如果打出三个ctrl+z则会返回EOF(-1)
2.3 占位符
scanf的占位符与printf基本一致
下面说明几个特殊的情况
1.%c
scanf中%c不会忽略起首的空白字符
倘或需要%c忽略起首的空白字符
可以在c前面加上空格
c
char ch ="0";
scanf("% c",&ch);
这样就会忽略一个或多个起首空白字符
2.%s
scanf中%s会读取从第一个非空白字符开始,到最后遇到空白字符(空格,换行,制表符)结束
因此scanf无法读取多个单词
c
scanf("%s"," hello world");//只读取hello
另外sacnf也可以限定输入长度
%10s表示读取的最大长度是10
这样可以在我们给数组输入值时,防止读取的长度超过数组的长度
c
char arr[11] = { 0 };
scanf("%10s",arr);//arr数组名就是地址,无需使用取地址符号&
这样无论用户输入多少数据,scanf都只会读取最多10个字符,后面的都会被丢弃
2.4 赋值忽略符*
假定我们要输入一个日期包含年月日
c
int main()
{
int year,month,day;//创建年月日变量
scanf("%d-%d-%d",&year,&month,&day);//输入值
printf("%d %d %d",year,month,day);//打印年月日
return 0;
}
如果我们输入2025-12-2,符合scanf函数中的格式,则可以正确打印出年月日

但如果我们输入2025/12/2,与scanf中的格式不符合,则会解析错误

此时,如果我们想忽略其中的格式,则可以用到赋值忽略符*
*放在加在任何占位符%后面,当读取到此处就会被丢弃,不会返回
例如,%*c,读取到字符后不会返回,而是直接丢弃
c
scanf("%d%*c%d%*c%d",&year,&month,&day);
此时,我们再打印年月日就会忽略中间的字符

总结
这篇文章我们详细介绍了printf和scanf函数,希望能对你有帮助
有错误的地方希望可以得到大佬的指正
最后不要吝啬你的点赞,收藏和评论!!!
感谢你的观看