1. 程式人生 > >printf家族探秘

printf家族探秘

出現 clas urn 匹配 方法 精度 com 忽略 打印

有一個函數,是我們從學習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家族探秘