C语言编程之格式化输出函数printf()说明
格式化字符串,是一些程序設(shè)計語言在格式化輸出API函數(shù)中用于指定輸出參數(shù)的格式與相對位置的字符串參數(shù),例如C、C++等程序設(shè)計語言的printf類函數(shù),其中的轉(zhuǎn)換說明用于把隨后對應(yīng)的0個或多個函數(shù)參數(shù)轉(zhuǎn)換為相應(yīng)的格式輸出;格式化字符串中轉(zhuǎn)換說明以外的其它字符原樣輸出。
格式化占位符(format placeholder),語法是:
%[parameter][flags][field width][.precision][length]type
?字符?? ?描述
n$?? ?n是用這個格式說明符(specifier)顯示第幾個參數(shù);這使得參數(shù)可以輸出多次,使用多個格式說明符,以不同的順序輸出。 如果任意一個占位符使用了parameter,則其他所有占位符必須也使用parameter。這是POSIX擴展,不屬于ISO C。例:printf("%2$d %2$#x; %1$d %1$#x",16,17) 產(chǎn)生"17 0x11; 16 0x10"
Flags可為0個或多個:
字符?? ?描述
+?? ?總是表示有符號數(shù)值的'+'或'-'號,缺省情況是忽略正數(shù)的符號。僅適用于數(shù)值類型。
空格?? ?使得有符號數(shù)的輸出如果沒有正負號或者輸出0個字符,則前綴1個空格。如果空格與'+'同時出現(xiàn),則空格說明符被忽略。
-?? ?左對齊。缺省情況是右對齊。
#?? ?對于'g'與'G',不刪除尾部0以表示精度。對于'f', 'F', 'e', 'E', 'g', 'G', 總是輸出小數(shù)點。對于'o', 'x', 'X', 在非0數(shù)值前分別輸出前綴0, 0x, and 0X表示數(shù)制。
0?? ?如果width選項前綴以0,則在左側(cè)用0填充直至達到寬度要求。例如printf("%2d", 3)輸出" 3",而printf("%02d", 3)輸出"03"。如果0與-均出現(xiàn),則0被忽略,即左對齊依然用空格填充。?
Field Width給出顯示數(shù)值的最小寬度,典型用于制表輸出時填充固定寬度的表目。實際輸出字符的個數(shù)不足域?qū)?#xff0c;則根據(jù)左對齊或右對齊進行填充。實際輸出字符的個數(shù)超過域?qū)挷⒉灰饠?shù)值截斷,而是顯示全部。寬度值的前導(dǎo)0被解釋為0填充標志,如上述;前導(dǎo)的負值被解釋為其絕對值,負號解釋為左對齊標志。如果域?qū)捴禐?,則由對應(yīng)的函數(shù)參數(shù)的值為當前域?qū)挕?/p>
Precision通常指明輸出的最大長度,依賴于特定的格式化類型。對于d、i、u、x、o的整型數(shù)值,是指最小數(shù)字位數(shù),不足的位要在左側(cè)補0,如果超過也不截斷,缺省值為1。對于a,A,e,E,f,F的浮點數(shù)值,是指小數(shù)點右邊顯示的數(shù)字位數(shù),必要時四舍五入或補0;缺省值為6。對于g,G的浮點數(shù)值,是指有效數(shù)字的最大位數(shù);缺省值為6。對于s的字符串類型,是指輸出的字節(jié)的上限,超出限制的其它字符將被截斷。如果域?qū)挒?,則由對應(yīng)的函數(shù)參數(shù)的值為當前域?qū)挕H绻麅H給出了小數(shù)點,則域?qū)挒?。
Length指出浮點型參數(shù)或整型參數(shù)的長度。此項Microsoft稱為“Size”??梢院雎?#xff0c;或者是下述:
字符?? ?描述
hh?? ?對于整數(shù)類型,printf期待一個從char提升的int尺寸的整型參數(shù)。
h?? ?對于整數(shù)類型,printf期待一個從short提升的int尺寸的整型參數(shù)。
l?? ?對于整數(shù)類型,printf期待一個long尺寸的整型參數(shù)。
對于浮點類型,printf期待一個double尺寸的整型參數(shù)。對于字符串s類型,printf期待一個wchar_t指針參數(shù)。對于字符c類型,printf期待一個wint_t型的參數(shù)。
ll?? ?對于整數(shù)類型,printf期待一個long long尺寸的整型參數(shù)。Microsoft也可以使用I64。
L?? ?對于浮點類型,printf期待一個long double尺寸的整型參數(shù)。
z?? ?對于整數(shù)類型,printf期待一個size_t尺寸的整型參數(shù)。
j?? ?對于整數(shù)類型,printf期待一個intmax_t尺寸的整型參數(shù)。
t?? ?對于整數(shù)類型,printf期待一個ptrdiff_t尺寸的整型參數(shù)。
?此外,在ISO C99廣泛接受前,還有幾個平臺相關(guān)的length選項:
字符?? ?描述
I?? ?對于有符號整數(shù)類型,printf期待一個ptrdiff_t尺寸的整型參數(shù)。對于無符號整數(shù)類型,printf期待一個size_t尺寸的整型參數(shù)。常見于Win32/Win64平臺。
I32?? ?對于整數(shù)類型,printf期待一個32位(雙字)的整型參數(shù)。常見于Win32/Win64平臺。
I64?? ?對于整數(shù)類型,printf期待一個64位(四字)的整型參數(shù)。常見于Win32/Win64平臺。
q?? ?對于整數(shù)類型,printf期待一個64位(四字)的整型參數(shù)。常見于BSD平臺。
ISO C99的頭文件inttypes.h包含了許多宏,用于平臺獨立的printf編碼。例如:?
宏?? ?定義
PRId32?? ?典型地等效于I32d (Win32/Win64)或d
PRId64?? ?典型地等效于I64d (Win32/Win64), lld (32位平臺)或ld (64位平臺)
PRIi32?? ?典型地等效于I32i (Win32/Win64)或i
PRIi64?? ?典型地等效于I64i (Win32/Win64), lli (32位平臺)或li (64位平臺)
PRIu32?? ?典型地等效于I32u (Win32/Win64)或u
PRIu64?? ?典型地等效于I64u (Win32/Win64), llu (32位平臺)或lu (64位平臺)
PRIx32?? ?典型地等效于I32x (Win32/Win64)或x
PRIx64?? ?典型地等效于I64x (Win32/Win64), llx (32位平臺)或lx (64位平臺)?
類型
Type,也稱轉(zhuǎn)換說明(conversion specification/specifier),可以是:
字符?? ?描述
d, i?? ?有符號十進制數(shù)值int。'%d'與'%i'對于輸出是同義;但對于scanf()輸入二者不同,其中%i在輸入值有前綴0x或0時,分別表示16進制或8進制的值。如果指定了精度,則輸出的數(shù)字不足時在左側(cè)補0。默認精度為1。精度為0且值為0,則輸出為空。
u?? ?十進制unsigned int。如果指定了精度,則輸出的數(shù)字不足時在左側(cè)補0。默認精度為1。精度為0且值為0,則輸出為空。
f, F?? ?double型輸出10進制定點表示。'f'與'F'差異是表示無窮與NaN時,'f'輸出'inf', 'infinity'與'nan';'F'輸出'INF', 'INFINITY'與'NAN'。小數(shù)點后的數(shù)字位數(shù)等于精度,最后一位數(shù)字四舍五入。精度默認為6。如果精度為0且沒有#標記,則不出現(xiàn)小數(shù)點。小數(shù)點左側(cè)至少一位數(shù)字。
e, E?? ?double值,輸出形式為10進制的([-]d.ddd e[+/-]ddd). E版本使用的指數(shù)符號為E(而不是e)。指數(shù)部分至少包含2位數(shù)字,如果值為0,則指數(shù)部分為00。Windows系統(tǒng),指數(shù)部分至少為3位數(shù)字,例如1.5e002,也可用Microsoft版的運行時函數(shù)_set_output_format 修改。小數(shù)點前存在1位數(shù)字。小數(shù)點后的數(shù)字位數(shù)等于精度。精度默認為6。如果精度為0且沒有#標記,則不出現(xiàn)小數(shù)點。
g, G?? ?double型數(shù)值,精度定義為全部有效數(shù)字位數(shù)。當指數(shù)部分在閉區(qū)間 [-4,5] 內(nèi),輸出為定點形式;否則輸出為指數(shù)浮點形式。'g'使用小寫字母,'G'使用大寫字母。小數(shù)點右側(cè)的尾數(shù)0不被顯示;顯示小數(shù)點僅當輸出的小數(shù)部分不為0。
x, X?? ?16進制unsigned int。'x'使用小寫字母;'X'使用大寫字母。如果指定了精度,則輸出的數(shù)字不足時在左側(cè)補0。默認精度為1。精度為0且值為0,則輸出為空。
o?? ?8進制unsigned int。如果指定了精度,則輸出的數(shù)字不足時在左側(cè)補0。默認精度為1。精度為0且值為0,則輸出為空。
s?? ?如果沒有用l標志,輸出null結(jié)尾字符串直到精度規(guī)定的上限;如果沒有指定精度,則輸出所有字節(jié)。如果用了l標志,則對應(yīng)函數(shù)參數(shù)指向wchar_t型的數(shù)組,輸出時把每個寬字符轉(zhuǎn)化為多字節(jié)字符,相當于調(diào)用wcrtomb函數(shù)。
c?? ?如果沒有用l標志,把int參數(shù)轉(zhuǎn)為unsigned char型輸出;如果用了l標志,把wint_t參數(shù)轉(zhuǎn)為包含兩個元素的wchart_t數(shù)組,其中第一個元素包含要輸出的字符,第二個元素為null寬字符。
p?? ?void *型
a, A?? ?double型的16進制表示,"[?]0xh.hhhh p±d"。其中指數(shù)部分為10進制表示的形式。例如:1025.010輸出為0x1.004000p+10。'a'使用小寫字母,'A'使用大寫字母。[2][3] (C++11流使用hexfloat輸出16進制浮點數(shù))
n?? ?不輸出字符,但是把已經(jīng)成功輸出的字符個數(shù)寫入對應(yīng)的整型指針參數(shù)所指的變量。
%?? ?'%'字面值,不接受任何flags, width, precision or length。
寬度與精度格式化參數(shù)可以忽略,或者直接指定,或者用星號"*"表示取對應(yīng)函數(shù)參數(shù)的值。例如printf("%*d", 5, 10)輸出"?? 10";printf("%.*s", 3, "abcdef") 輸出"abc"。
如果函數(shù)參數(shù)太少,不能匹配所有的格式參數(shù)說明符,或者函數(shù)參數(shù)的類型不匹配,將導(dǎo)致未定義(undefined)行為。過多的函數(shù)參數(shù)被忽略。許多時候,未定義的行為將導(dǎo)致格式化字符串攻擊。
某些編譯器,如GCC,會靜態(tài)檢查printf這一類函數(shù)的格式化參數(shù)并編譯警告存在的問題(當使用編譯標志-Wall或-Wformat)。GCC也會對用戶自定義的printf風格函數(shù)做靜態(tài)檢查,如果在函數(shù)定義時使用了非標準的 __attribute__((format(...)))。
來源:維基百科中文版
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的C语言编程之格式化输出函数printf()说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GoDaddy服务器MySQL配置文件,
- 下一篇: 黑马程序员Linux系统开发视频之创建守