printf 函數族
絮絮叨叨
printf 應該是學習C語言的第一個函數,我們都知道它是用于字符串格式化輸出的。但是它的用法你真正了解了嗎?
printf 系列函數不僅僅可用用來打印字符串到控制臺,還可以向其他標準IO或者數組中格式化輸出。
01
printf 函數族簡介
printf 函數是定義在 stdio.h 中的函數,屬于C標準庫。不同編譯器實現過程不同,在這并不會詳細描述它的底層實現原理。只針對printf函數族的使用。
printf 函數族共有8個函數:
其中8個函數可分為兩大類,每一類中都有一個相互對應。例如:printf 和 vprintf 兩個函數為一對。其功能完全一樣,不同點在于參數格式。
printf函數參數使用不定參數(...)傳遞參數,vprintf 使用參數列表(va_list) 傳遞參數。
02
printf 函數族功能介紹
int printf (const char ** * _format, ...);**
printf是我們使用最多的一個函數,其功能為把格式化之后的字符串輸出到標準輸出流中。
大多數時候標準輸出是控制臺的顯示,不過在MCU中,我們經常會將標準輸出重定向到串口,然后通過串口查看信息。
所有printf函數族的返回值是:寫入字符串成功返回寫入的字符總數,寫入失敗則返回一個負數。
int sprintf (char * _s, const char * _format, ...);
sprintf 功能與printf 類似,不過它是將字符串格式化輸出到它的第一個參數所指定的字符數組中。
由于它是輸出到字符數組,則存在數組大小不足或者傳遞參數非法,導致格式化后的字符溢出的情況,導致緩沖區后面的棧/堆數組被修改。
更推薦使用 snprintf 函數代替 sprintf 函數。
int fprintf (FILE _s, const char * _format, ...); *
fprintf 功能與printf 類似,但它的輸出是流(FILE *) 中。這個流可以是標準輸出(stdout)、標準錯誤(stderr)或者文件 (FILE *fd)。
也就是說 fprintf 可以直接向系統中文件格式化輸出字符串。
int snprintf (FILE _s,size_t size, const char * _format, ...); *
snprintf 是 sprintf 的升級版,它解決了 sprintf 可能存在的緩沖區溢出問題。
它的第一個參數和 sprintf 一樣,指定了一個字符數組存放格式化后的字符串,不過在它的第二個參數中指定了緩沖區數組的大小。
如果格式化字符串超過緩沖區數組大小,則進行截斷,超出部分不進行輸出。
03
printf 參數
接下來是本次的重點:格式化輸出的參數。
printf 函數族的格式化參數屬性相同,下面以 printf 為例講解字符串格式屬性。
printf 格式化控制屬性格式如下:
%[flags][width][.prec][length]type
%[標志][最小寬度][.精度][類型長度]類型
1. type(類型)
type 是格式控制字符的類型,為必選項。在 printf 中會根據類型對應的格式去棧中讀取對應大小的數據,務必保證參數類型和參數的數據類型保持一致。
type 支持的類型如下所示:
2. flags(標志)
flags 用于規定輸出樣式。例如我們有時需要對其打印多個數字,但是數組長度并不是固定的,此時可以使用flag參數進行設置。
例如:左對齊打印四個數字,1,12,123,1234。
flag 支持參數如下:
3. number(寬度)
字符寬度有固定和可變兩種類型。固定寬度為在類型前面加一個數字表示寬度:
printf("num is %8dn",1234);
可變寬度類型是指在格式化的寬度可由一個變量來指定,在程序中使用一個星號(*)進行占位,然后在參數中指定寬度。
printf("num is %*dn",8,1234);
4. precision(精度)
精度的屬性格式只有一個,對不同類型的效果不同。具體描述見下圖:
精度的屬性常用在格式化浮點數時使用:
printf("float : %2.3fn",1.23);
輸出結果為:float : 1.230
5. length(類型長度)
類型長度用于修飾type(類型)的長度。比如在打印一個 uint64_t 類型的無符號整形數字時,應該使用%llu來進行格式化輸出。
其中ll為修飾類型的長度為long long 的整形。
04
結語
printf 函數族是標準輸入輸出庫中的標準輸出部分,其還有一個更加強大 scanf 函數族,這個就留給后面有時間在來寫了~
-
C語言
+關注
關注
180文章
7630瀏覽量
140330 -
字符串
+關注
關注
1文章
589瀏覽量
21108 -
函數
+關注
關注
3文章
4370瀏覽量
64193 -
Printf
+關注
關注
0文章
84瀏覽量
14084
發布評論請先 登錄
實現重定向printf()和scanf() 函數案例分析

《51單片機筆記》keilC51軟件中printf函數內部機制詳解,單片機中怎么使用printf函數,printf函數編寫程序例子及

通過串口利用printf函數輸出數據

STM32中串行通訊中printf函數的使用

評論