目录
1.printf是什么?
2.格式控制字符串 与 输出值参数表
2.1格式控制字符串
2.2输出值参数表
2.3格式字符 和 格式修饰符 一览图
2.3.1格式字符一览图
2.3.2格式修饰符
3.常用格式字符详解
%d
%md
%f
%.nf
%m.f
%c和%s
%c
%s
6.printf的返回值
5.printf中的常见问题
6.总结
7.后言
1.printf是什么?
printf函数是格式输出函数,其关键字最末一个字母f即为“格式(format)”之意。其功能是按照用户指定的格式,把指定的数据显示到显示器屏幕上。
printf函数是一个标准库函数,它是函数原型在头文件“stdio.h”。但作为一个特例,不要求在使用printf函数之前必须包含stdio.h文件。printf函数调用的一般形式为:
printf(“格式控制字符串”,输出表列)
printf("f=%f,c=%f\n",f,c);
其中,f=%f,c=%f\n是格式控制字符串,f,c是输出值参数表。
2.格式控制字符串 与 输出值参数表
printf("f=%f,c=%f\n",f,c);
2.1格式控制字符串
格式控制字符串是用“双引号”括起来的字符串,包括三类信息:
- 格式字符。格式字符由“%”引导,如%d、%f等。它的作用是控制输出字符的格式。
- 转义字符。格式控制字符串里的转义字符按照转义后的含义输出,如上面printf函数双引号内的换行符“\n”,即输出回车。
- 普通字符。普通字符即需要在输出时原样输出的字符,如上面printf函数中双引号内的“f=”和“c= ”部分。
2.2输出值参数表
(2)输出值参数表是需要输出的数据项的列表,输出数据项可以是常量、变量或表达式,输出值参数之间用逗号分隔,其类型应与格式字符相匹配。每个格式字符和输出值参数表中的输出值参数一一对应,如果没有输出参数时,格式控制字符串中不再需要格式字符。
2.3格式字符 和 格式修饰符 一览图
2.3.1格式字符一览图
格式字符 | 说明 |
d | 输出带符号的十进制整数,正数的符号省略 |
u | 以无符号的十进制整数形式输出 |
o | 以无符号的八进制整数形式输出,不输出前导符0 |
x | 以无符号十六进制整数形式(小写)输出,不输出前导符0x |
X | 以无符号十六进制整数形式(大写)输出,不输出前导符0X |
f | 以小数形式输出单、双精度数,隐含输出6位小数 |
e | 以指数形式(小写e表示指数部分)输出实数 |
E | 以指数形式(大写E表示指数部分)输出实数 |
g | 自动选取f或e中输出宽度较小的一种使用,且不输出无意义的0 |
c | 输出一个字符 |
s | 输出字符串 |
注:%o %x %X如果向输出前导符要在格式字符前加#, 如%#o %#x %#X 。
2.3.2格式修饰符
格式修饰符 | 说明 |
英文字母l | 修饰格式字符d、u、o、x时,用于输出long型数据 |
英文字母L | 修饰格式字符f、e、g时,用于输出long double型数据 |
英文字母h | 修饰格式字符d、o、x时,用于输出short型数据 |
输出域宽m(m为整数) | 指定输出项输出时所占的列数 |
显示精度.n | (n为整数) 对于实数,表示输出n位小数;对于字符串,表示截取的字符个数 |
-(减号) | 输出数字或字符在域内向左靠 |
3.常用格式字符详解
%d
输出带符号的十进制整数,正数的符号不输出。
int a = 888,b = -666;printf("%d\n%d",a,b);
输出结果:
还可以在%和格式字符中间插入格式修饰符,用于指定输出数据的域宽(所占的列数),如用“%5d”,指定输出数据占5列,输出的数据在域内向右靠齐。如:
%md
int a = 888, b = -666;printf("%5d\n%5d", a, b);
输出结果:
从结果可以看出,在%和d中间加数字5,888占3个域宽,指定域宽>输出数据长度。输出数据靠右,前面补空格。
如果 指定域宽<输出数据长度 呢?
可见会按照原样输出。
若要输出long(长整型)数据,则在格式字符d前面加字母l(代表long),即“%ld”。
%f
输出一个实数(包括单精度、双精度、长双精度),以小数形式输出,有以下几种用法:
不指定输出数据的长度,由系统根据数据的实际情况决定数据所占的列数。系统处理的方法一般是:实数中的整数部分全部输出,小数部分输出6位。
虽然a是double类型,所以 a/3也是double类型。但%f格式字符只能输出6位小数。
那怎么控制输出小数点后面的位数呢?
%.nf
n表示小数点后保留n位小数。如下
当然浮点型也可以控制域宽,如下
%m.f
可以看出 %3.f 实际是 %3.0f,小数点前面控制域宽,小数点后面控制小数点保留的个数。
%c和%s
%c
也可以加格式修饰符指定域宽,如:
可见字符a前面补4个空格。因为字符a占一个占位。
%s
6.printf的返回值
初学C语言时用的最多的函数就是printf函数,而printf函数的返回值是被大多数人忽略的,以至于很多应聘者在碰到关于printf返回值的编程时一头雾水,接下来就来谈谈printf的返回值。
int A=43;printf("%d\n",printf("%d",printf("%d",A)));
看到运行结果和代码,可以想到是为什么吗?没看出也没关系,我们分步骤看看。
代码逻辑:首先,从最内层开始A=43被直接输出。然后,最内层printf的返回值以%d的格式被中间层的printf输出为2。最后,最外层的printf以%d的格式输出中间层的返回值为1。
其实观察第二个printf的输出值和第三个printf的输出值,第一个printf的输出值和第二个printf的输出值不难发现:
printf的返回值就是输出的字符数量第三个printf输出”43″字符数量为2,于是返回值为2,第二个printf就输出”2”
第二个printf输出”2″字符数量为1,于是返回值为1,第一个printf就输出”1″
要注意一点是:返回值是是输出的字符数量,包括数字,字母,标点符号,空格等。
printf("%d\n", printf("0,1,2,3\n"));
通过运行结果不难看出,数字0123分别占一个字符,标点符号” , “也是分别占一个字符位,换行符” \n “也是占一个。
如果代码加一句,猜猜num的值是多少?
int num=printf("%d\n", printf("0,1,2,3\n"));printf("%d", num);
答案是2,num值为2说明num接受printf的返回值是2,也说明了printf输出字符数量是2,其中一个是数字8,另外一个就是printf格式控制中的 ” \n “可见,格式控制中的字符也算进返回值哦!
那有人又问了” />因为是先输出了8,再换行啊。要注意执行先后顺序!!!
5.printf中的常见问题
- 格式控制字符串中有%引导的格式字符时,输出值参数表中的数量以及类型必须和格式字符一致
分析:
- 第一个printf函数中的输出参数b是double型值58.8,但对应的格式控制符为%d,当类型不一致时并不会进行类型转换,而会将实际转入的double型值当作需要的整形类型来理解,因此出现非预期结果;
- 第二个printf函数中,格式控制字符串给出了两个%引导的格式字符,但是输出参数表中只有一个参数a,参数缺少。因此输出c的值默认为内存中a变量后面存储单元的数据值,c的值无法确定。
- 格式控制字符串中没有%引导的格式字符时,也不需要输出值参数表,直接输出字符串内容,转义字符按照转义后的实际意义输出,如:
- 实现左对齐方法
- 通过“ – ”号来控制控制左对齐,可以无视域宽控制
6.总结
- 常用的格式控制,一般是%d,%f,%c,%s,及其他们独特的输出方式
- 每一个输出都可以设置域宽,默认内容右对齐
- 格式控制字符串中有%引导的格式字符时,输出值参数表中的数量以及类型必须和格式字符一致
- 格式控制字符串中没有%引导的格式字符时,也不需要输出值参数表,直接输出字符串内容,转义字符按照转义后的实际意义输出
- 实现左对齐方法:通过“ – ”号来控制控制左对齐
出生日期输入输出_牛客题霸_牛客网 (nowcoder.com)
小练习题,可以考核自己掌握了吗?
7.后言
本篇比较详细的介绍了C语言中,printf函数的概念,使用方法,注意事项,和实践操作。
因篇幅有限,和个人能力有限,可能存在内容不完整和错误,希望大家积极指正。我相信此文章可以给小白一定的帮助,大佬也可以当复习,感谢大家支持。