printf 函数丨格式符号的特殊用法
通常我们会看到 C 语言程序运行后,会有这样的结果。
不由得感到好奇,这是怎么做到右对齐的?难道是一个一个空格敲?那这岂不是太费劲了,还要数敲了几个空格。
其实这很简单,只要在格式符号中做一点点手脚,就可以轻松实现这个效果。
1、对齐
首先就说一下,是怎么做到对齐的。
平常我们正常使用格式符号,都是从左到右输出,左边顶格也就是左对齐的方式。
那么想要右对齐,只要在百分号(%)在输出格式字符(d/f/c等)之间加一个数字,即可轻松实现。
#include<stdio.h>
int main()
int a = 1;
printf("%5d\n", -35);
printf("%5d\n", 65);
printf("%5c\n", 'A');
printf("%5p\n", &a);
printf("%5s\n", "你好");
return 0;
}
运行结果:
这里的数字在格式符号中表示为宽度的意思,当输出的内容长度小于给定的宽度值,就会自动进行右对齐,左边空缺的位置用空格补上。
但当输出的内容大于给定的宽度值,例如输出内存地址,固定为 8 位,那么它就不再具备对齐的资格,该怎么输出就怎么输出。
既然可以给定的是一个数字,那我要是给一个负数,会是怎么样的呢?
#include<stdio.h>
int main()
int a = 1;
printf("%-5d\n", -35);
printf("%-5d\n", 65);
printf("%-5c\n", 'A');
printf("%-5p\n", &a);
printf("%-5s\n", "你好");
return 0;
}
运行结果:
这就跟平常打印输出好像是长得一模一样,但实际不然。
正常输出,例如 -35,在屏幕上只有 -35 三个内容。但加上 -5,在屏幕上实际有 5 个位置,其余两个是用空格进行填补的。
百分号(%)加上负号(-),在 C 语言中表示为左对齐。
2、补 0
接着就是在数字面前补 0 的操作。
难道这不是你在打印输出的时候,偷摸摸地手动加上 0 么?
当然不是。首先在 C 语言中数字前面加上 0,就变成了八进制的数值常数。
例如:
int a = 0035; // 实际对应值为 29
其次,在字符串中的格式符号前添加 0,是有可能实现的。但如果要求数字前面有 100 个 0,那不是一件非常麻烦的事情吗?要是一不小心输错,就又得从头数。
但只要在格式符号中的百分号(%)后面加上一个 0,并匹配上相应的宽度,来瞧瞧结果。
#include<stdio.h>
int main()
int a = 1;
printf("%010d\n", -3);
printf("%010f\n", 3.14);
printf("%010p\n", &a);
printf("%010c\n", 'A');
printf("%010s\n", "你好");
return 0;
}
运行结果:
补 0 的效果只对 %p 符号没有效果,因为该符号的输出结果固定为 8 位。
那么,我想要它左对齐,后面补 0 呢?
很可惜,目前这个在格式符号中是实现不了的。单单说 -003 和 -300 之间就有了天大的区别。
且 %-0,亦或者 %0-,都会使得格式符号的对齐、补 0 的效果失效,最后按照正常的格式符号进行输出。
3、精度
%f 和 %lf 总是会输出小数点后六位,而且一串子的 0 有时候看上去也不是那么讨喜。那么,有什么办法将其省略到后 2 位?
方法在上一篇文章中有简单地一笔带过,即使用 %.nf 格式。
该符号会对输出的小数保留到小数点后 n 位,并会自动进行四舍五入。
#include<stdio.h>
int main()
printf("%.2f", 3.155555);
printf("%.2lf", 6.44448);
return 0;
}
输出结果:
那么,问题来了,该格式对浮点数类型会进行四舍五入,并保留到小数点后 n 位。如果用在其他格式符号中,会发生什么样的奇妙效果呢?
#include<stdio.h>
int main()
int a = 1;
printf("%010d\n", -3);