打印
[牛人杂谈]

C语言printf函数的高级用法

[复制链接]
1662|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
虽然我们已经熟悉了 printf,但是还没有把它发挥到极致,printf 可以有更加“炫酷”的输出。

假如现在老师要求我们用C语言输出一个 4×4 的整数矩阵,为了增强阅读性,数字要对齐,怎么办呢?我们显然可以这样来做:
  • #include <stdio.h>
  • #include <stdlib.h>
  • int main()
  • {
  •     int a1=20, a2=345, a3=700, a4=22;
  •     int b1=56720, b2=9999, b3=20098, b4=2;
  •     int c1=233, c2=205, c3=1, c4=6666;
  •     int d1=34, d2=0, d3=23, d4=23006783;
  •     printf("%d        %d       %d       %d\n", a1, a2, a3, a4);
  •     printf("%d     %d      %d     %d\n", b1, b2, b3, b4);
  •     printf("%d       %d       %d         %d\n", c1, c2, c3, c4);
  •     printf("%d        %d         %d        %d\n", d1, d2, d3, d4);
  •     system("pause");
  •     return 0;
  • }


运行结果:20        345       700       2256720     9999      20098     2233       205       1         666634        0         23        23006783
矩阵一般在大学的《高等数学》中会讲到,m×n 的数字矩阵可以理解为把 m×n 个数字摆放成 m 行 n 列的样子。
看,这是多么地自虐,要敲那么多空格,还要严格控制空格数,否则输出就会错位。

类似的需求随处可见,整齐的格式会更加美观,让人觉得生动有趣。我们大可不必像上面一样,printf 可以更好的控制输出格式。
  • #include <stdio.h>
  • #include <stdlib.h>
  • int main()
  • {
  •     int a1=20, a2=345, a3=700, a4=22;
  •     int b1=56720, b2=9999, b3=20098, b4=2;
  •     int c1=233, c2=205, c3=1, c4=6666;
  •     int d1=34, d2=0, d3=23, d4=23006783;
  •     printf("%-9d %-9d %-9d %-9d\n", a1, a2, a3, a4);
  •     printf("%-9d %-9d %-9d %-9d\n", b1, b2, b3, b4);
  •     printf("%-9d %-9d %-9d %-9d\n", c1, c2, c3, c4);
  •     printf("%-9d %-9d %-9d %-9d\n", d1, d2, d3, d4);
  •     system("pause");
  •     return 0;
  • }


输出结果:20        345       700       2256720     9999      20098     2233       205       1         666634        0         23        23006783这样写起来更加方便,即使改变某个数字,也无需修改 printf 语句。
沙发
heisexingqisi|  楼主 | 2017-3-27 16:32 | 只看该作者
%-9d中,d表示以十进制输出,9表示最少占9个字符的宽度,宽度不足以空格补齐,-表示左对齐。综合起来,%-9d表示以十进制输出,左对齐,宽度最小为9个字符。大家可以亲自试试%9d的输出效果。

printf 格式控制字符的完整形式如下:%[flags][width][.precision]type
[xxx] 并不是C语言规定的格式,只是一种习惯写法,表示此处的内容可有可无,后面会经常见到这样的写法。
1) type 也就是以什么类型输出,比如 %d、%f、%c,type 就分别对应 d、f、c;%-9d中 type 对应 d。type 必须有。

2) width 表示最小输出宽度,也就是占几个字符的位置;%-9d中 width 对应 9。

对于整数和小数,默认右对齐,不足的宽度以空格补齐,例如:printf("%10d%12f", 234, 9.8);输出结果为:       234    9.800000234 前面共有7个空格,9.8 前面有4个空格。

3) .precision 表示输出精度。

对于 %d,.precision 表示的其实是最小输出宽度,与 width 不同的是,不足的宽度以 0 补齐,例如:printf("%.10d\n", 4309);输出结果为:
0000004309

对于 %f,.precision 表示小数的位数,不足以 0 补齐,也就是精度,例如:printf("%.10f %.3f\n", 23.988, 2.9328745);输出结果为:
23.9880000000 2.933

使用特权

评论回复
板凳
heisexingqisi|  楼主 | 2017-3-27 16:33 | 只看该作者
4) flags 是标志字符,%-9d中 flags 对应-

几种常见的标志字符
标志字符含  义
-左对齐
+输出符号(正号或负号)
空格输出值为正时冠以空格,为负时冠以负号
#对c、s、d、u类无影响;
对o类,在输出时加前缀o;
对x类,在输出时加前缀0x;
对e、g、f 类当结果有小数时才给出小数点。
有兴趣的读者可以猛击这里查看更多关于 printf 的输出格式。
printf 的这些格式规范不是“小把戏”,优美的输出格式随处可见,例如 dos 下的 dir 命令,会整齐地列出当前目录下的文件:

使用特权

评论回复
地板
天灵灵地灵灵| | 2017-3-27 19:44 | 只看该作者
一个简单的格式化输出当年难道了多少入门者。

使用特权

评论回复
5
643757107| | 2017-3-27 20:17 | 只看该作者
转置的方法可以很容易通过for循环数组来实现。

使用特权

评论回复
6
734774645| | 2017-3-27 20:49 | 只看该作者
空格的控制可以通过定制打印空格的循环函数实现,通过参数设定空格的多少

使用特权

评论回复
7
heisexingqisi|  楼主 | 2017-4-6 20:25 | 只看该作者
格式化输出如果用好了,能省不少事情。

使用特权

评论回复
8
玛尼玛尼哄| | 2017-4-6 21:08 | 只看该作者
直接输出那种很难对齐,可以通过一些控制读取字符串长度的函数来控制

使用特权

评论回复
9
wahahaheihei| | 2017-4-6 22:06 | 只看该作者
可以重定向到不同的串口实现,这个例子是PC上的程序。

使用特权

评论回复
10
dongnanxibei| | 2017-4-8 11:40 | 只看该作者
system("pause");
这个函数好久没看到了。

使用特权

评论回复
11
yiy| | 2017-4-8 14:26 | 只看该作者
strlen这个函数用好了很重要

使用特权

评论回复
12
xixi2017| | 2017-4-9 14:05 | 只看该作者
一般我都是用的数码管显示的,很少用这个函数。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

131

主题

2615

帖子

2

粉丝