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