# 输出汇总 在C语言中,有三个函数可以用来在显示器上输出数据,它们分别是: - puts():只能输出字符串,并且输出结束后会自动换行。 - putchar():只能输出单个字符。 - printf():可以输出各种类型的数据,在前面的很多章节中都进行了介绍。 printf() 是最灵活、最复杂、最常用的输出函数,完全可以替代 puts() 和 putchar(),大家一定要掌握。前面的章节中我们已经介绍了 printf() 的基本用法,本节将重点介绍 printf() 的高级用法。 首先汇总一下格式控制符: | 格式控制符 | 说明 | | ------------------------------- | ------------------------------------------------------------ | | %c | 输出一个单一的字符 | | %hd、%d、%ld | 以十进制、有符号的形式输出 short、int、long 类型的整数 | | %hu、%u、%lu | 以十进制、无符号的形式输出 short、int、long 类型的整数 | | %ho、%o、%lo | 以八进制、不带前缀、无符号的形式输出 short、int、long 类型的整数 | | %#ho、%#o、%#lo | 以八进制、带前缀、无符号的形式输出 short、int、long 类型的整数 | | %hx、%x、%lx %hX、%X、%lX | 以十六进制、不带前缀、无符号的形式输出 short、int、long 类型的整数。如果 x 小写,那么输出的十六进制数字也小写;如果 X 大写,那么输出的十六进制数字也大写。 | | %#hx、%#x、%#lx %#hX、%#X、%#lX | 以十六进制、带前缀、无符号的形式输出 short、int、long 类型的整数。如果 x 小写,那么输出的十六进制数字和前缀都小写;如果 X 大写,那么输出的十六进制数字和前缀都大写。 | | %f、%lf | 以十进制的形式输出 float、double 类型的小数 | | %e、%le %E、%lE | 以指数的形式输出 float、double 类型的小数。如果 e 小写,那么输出结果中的 e 也小写;如果 E 大写,那么输出结果中的 E 也大写。 | | %g、%lg %G、%lG | 以十进制和指数中较短的形式输出 float、double 类型的小数,并且小数部分的最后不会添加多余的 0。如果 g 小写,那么当以指数形式输出时 e 也小写;如果 G 大写,那么当以指数形式输出时 E 也大写。 | | %s | 输出一个字符串 | ## printf高级用法 通过前面的学习,相信你已经熟悉了 printf() 的基本用法,但是这还不足以把它发挥到极致,printf() 可以有更加炫酷、更加个性、更加整齐的输出形式。 假如现在老师要我们输出一个 4×4 的整数矩阵,为了增强阅读性,数字要对齐,怎么办呢?我们显然可以这样做: ```c #include int main(){ int a1 = 20, a2 = 346, a3 = 700, a4 = 22; int b1 = 56720, b2 = 999, b3 = 26, b4 = 98; int c1 = 2, c2 = 5, c3 = 90, c4 = 213; int d1 = 996, d2 = 700, d3 = 72, d4 = 250; 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); return 0; } ``` 这样写起来更加方便,即使改变某个数字,也无需修改 printf() 语句,增加或者减少空格数目。 `%-9d`中,`d`表示以十进制输出,`9`表示最少占9个字符的宽度,宽度不足以空格补齐,`-`表示左对齐。综合起来,`%-9d`表示以十进制输出,左对齐,宽度最小为9个字符。大家可以亲自试试`%9d`的输出效果。 printf() 格式控制符的完整形式如下: ``` %[flag][width][.precision] type; ``` 1) type 表示输出类型,比如 %d、%f、%c、%lf,type 就分别对应 d、f、c、lf;再如,%-9d中 type 对应 d。type 这一项必须有,这意味着输出时必须要知道是什么类型。 2) width 表示最小输出宽度,也就是至少占用几个字符的位置;例如,%-9d中 width 对应 9,表示输出结果最少占用 9 个字符的宽度。 当输出结果的宽度不足 width 时,以空格补齐(如果没有指定对齐方式,默认会在左边补齐空格);当输出结果的宽度超过 width 时,width 不再起作用,按照数据本身的宽度来输出。 2) .precision 也可以用于整数和字符串,但是功能却是相反的: 用于整数时,.precision 表示最小输出宽度。与 width 不同的是,整数的宽度不足时会在左边补 0,而不是补空格。 用于字符串时,.precision 表示最大输出宽度,或者说截取字符串。当字符串的长度大于 precision 时,会截掉多余的字符;当字符串的长度小于 precision 时,.precision 就不再起作用。 4) flag 是标志字符。例如,%#x中 flag 对应 #,%-9d中 flags 对应-。下表列出了 printf() 可以用的 flag。 | 标志字符 | 含 义 | | -------- | ------------------------------------------------------------ | | - | `-` 表示左对齐。如果没有,就按照默认的对齐方式,默认一般为右对齐。 | | + | 用于整数或者小数,表示输出符号(正负号)。如果没有,那么只有负数才会输出符号。 | | 空格 | 用于整数或者小数,输出值为正时冠以空格,为负时冠以负号。 | | # | 对于八进制(%o)和十六进制(%x / %X)整数,# 表示在输出时添加前缀;八进制的前缀是 0,十六进制的前缀是 0x / 0X。对于小数(%f / %e / %g),# 表示强迫输出小数点。如果没有小数部分,默认是不输出小数点的,加上 # 以后,即使没有小数部分也会带上小数点。 |