首页 > 代码库 > printf家族探秘

printf家族探秘

有一个函数,是我们从学习c语言就开始的第一天就接触的,那就是printf函数,可是这个家族的函数,带给我们的便利却不是一点半点,所以写一篇用法总结。

1.printf函数

格式化输出,可以输出八进制,十进制,十六进制,可以输出字符串,%p输出地址。基本的东西就不在赘述了。

printf是有返回值的,只是一般我们用不到。printf()函数也有一个返回值,它返回所打印的字符的数目。如果有输出错误,那么printf()会返回一个负数(printf( ) 的一些老版本会有不同的返回值)。

技术分享

*号符,在printf函数中有着很强的格式化作用,如同linux中一样,* 代表任意匹配。

再看一个格式化输出十六进制的例子:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

int main(void)
{
    unsigned int a=0x1;
    printf("%#010x",a);
    return 0;
}

技术分享

在32位mcu编程中经常会打印地址,如stm32,而一般要求打印8个字节,而字节前导我们不希望使用空格而是使用前导0来填充,就可以使用上面的写法。

# 号:使用格式说明的可选形式,#o 打印的则以0(零)开始,八进制,#x或者#X,则以0x或者0X开始,十六进制。

0(零):对于所有数字格式,用前导零填充而不是空格。如果出现 - 标志或者指定了精度(对于整数)则忽略该标志。

那么%#010x:就表示:以十六进制输出,输出长度一共为10,前导用0填充而不是空格。由于#x的作用占用了两个位置,因为要输出0x,所以还剩下8个位置,这样就指定输出了十六进制8个字节长度的数据。

如果这样觉得我好阅读,可以不使用#,直接手动书写0x前缀,指定宽度为8,前导0即可:如:

技术分享

这是printf函数的常用方法,但是正真重要的,还是在于可变参数及其家族的变种函数。

2.fprintf函数

未完待续...

printf家族探秘