printf 家族
printf函數(shù)家族用于創(chuàng)建格式化的輸出,。標(biāo)準(zhǔn): 7.19.6.1
Tip
printf函數(shù)家族的格式代碼和scanf函數(shù)家族的格式代碼用法不同,。所以必須小心謹(jǐn)慎,防止誤用,。 兩者的格式代碼中的有些可選字段看上去是相同的,,這使得問(wèn)題變得更為困難。 《C和指針》
函數(shù)成員
printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf,
wprintf, fwprintf, swprintf, vwprintf, vfwprintf, vswprintf,
格式代碼
%[flags] [width] [.precision] [{hh | h | l | ll | j | z | t | L}]type
格式代碼由一個(gè)百分號(hào)開(kāi)頭,,后面跟
- 零個(gè)或者多個(gè) 標(biāo)志字符[flags],用于修改有些轉(zhuǎn)換的執(zhí)行方式
- 一個(gè)可選的 最小字段寬度[width]
- 一個(gè)可選的 精度[.precision]
- 一個(gè)可選的 修改符[{hh | h | l | ll | j | z | t | L}]
- 轉(zhuǎn)換類(lèi)型 type
轉(zhuǎn)換類(lèi)型 type
Character |
Type |
Output format |
c,C |
int |
用于printf時(shí),為單字節(jié);用于wprintf時(shí),為寬字節(jié). |
d,i |
int |
有符號(hào)十進(jìn)制數(shù). |
u,o,x,X |
unsigned |
無(wú)符號(hào)數(shù)值. 十進(jìn)制:u; 八進(jìn)制:o; 十六進(jìn)制:x,X, 兩者區(qū)別, x是abcdef, X使用ABCDEF. |
e,E |
double |
指數(shù)形式輸出.如:6.023000e23是使用e;6.023000E23是使用E. 小數(shù)點(diǎn)后面的位數(shù)由精度字段決定,默認(rèn)為6 |
f,F |
double |
常規(guī)浮點(diǎn)數(shù)格式輸出.如:[–]dddd.dddd. 小數(shù)點(diǎn)后面的位數(shù)由精度字段決定,默認(rèn)為6 |
g,G |
double |
自動(dòng)選擇使用%f,%e,%E. 如果指數(shù)大于等于-4但小于精度字段使用%f,否則使用%e(g->e, G->E) |
a,A |
double |
有符號(hào)的十六進(jìn)制雙精度浮點(diǎn)值[?]0xh.hhhh p±dd, 其中h.hhhh為十六進(jìn)制的尾數(shù), dd為指數(shù) |
s |
char* |
用于printf時(shí),為單字節(jié)字符串;用于wprintf時(shí),為寬字節(jié)字符串. 長(zhǎng)度為字符串長(zhǎng)度或者精度.(wcrtomb轉(zhuǎn)碼) |
S |
char* |
用于printf時(shí),為寬字節(jié)字符串;用于wprintf時(shí),為單字節(jié)字符串. 長(zhǎng)度為字符串長(zhǎng)度或者精度.(VS) |
P |
void* |
指針值轉(zhuǎn)換為因編譯器而異的可打印字符.(VS:十六進(jìn)制數(shù)字) |
n |
int* |
無(wú)輸出,,返回到目前為止函數(shù)所產(chǎn)生的的輸出字符數(shù)保存在該指針?biāo)赶虻膬?nèi)存中(VS中默認(rèn)禁用,使用_set_printf_count_output(1)開(kāi)啟) |
% |
|
輸出一個(gè)%字符 |
- hs 在用于wprintf時(shí),存在字符集問(wèn)題,。
-
VS需要設(shè)置 setlocale(LC_ALL, “”);
GCC需要設(shè)置編譯參數(shù) gcc Test.cpp -finput-charset=gbk
setlocale(LC_ALL, "");
wprintf(L"%hs \n", "abc");
wprintf(L"%hs \n", "陳");
格式標(biāo)志[flags]
Flag |
Meaning |
Default |
- |
值在字段中左對(duì)齊 |
右對(duì)齊 |
+ |
對(duì)于格式化有符號(hào)的值時(shí),對(duì)于非負(fù)值,強(qiáng)制加正號(hào) |
非負(fù)值,不顯示正號(hào) |
0 |
當(dāng)數(shù)值為右對(duì)齊時(shí),用0填充未使用的列 |
用空格填充 |
空格 |
當(dāng)有符號(hào)的數(shù)值為非負(fù)時(shí),在其開(kāi)始位置添加一個(gè)空格 |
不添加空格 |
# |
選擇某些類(lèi)型的另一種轉(zhuǎn)換形式(見(jiàn)下表) |
|
- 0標(biāo)志
- 可用于 d,iu,o,x,X,E,f,g,G ,。使用 d,i,u,o,x,X 類(lèi)型(type)時(shí),如果給出了精度(如:%04.d),,0標(biāo)志就被忽略,。 如果代碼中出現(xiàn)了負(fù)號(hào)標(biāo)志,0標(biāo)志也沒(méi)有效果
- 空格標(biāo)志
- 和正號(hào)標(biāo)志是互斥的,,如果兩個(gè)同時(shí)給出,,空格標(biāo)志將被忽略。
用于.. |
#標(biāo)志 |
o |
保證產(chǎn)生的值以一個(gè)零開(kāi)頭 |
x,X |
在非零值前面加0x前綴(%X則為0X) |
e,E,f,(a,A) |
確保結(jié)果始終包含一個(gè)小數(shù)點(diǎn),,即使他后面沒(méi)有數(shù)字 |
g,G |
和上面的e,E,f相同,。另外,綴尾的0并不從小數(shù)中去除 |
c,d,i,u,s |
忽略該標(biāo)志 |
字段寬度[width]
字符寬度是一個(gè)十進(jìn)制數(shù),用于指定將出現(xiàn)在結(jié)果中的 最小 字符數(shù).如果值得字符數(shù)少于字段寬度,就會(huì)對(duì)它填充以增加長(zhǎng)度. flags決定填充是用空白字符還是零以及它出現(xiàn)在值的左邊還是右邊.
字段精度[.precision]
精度已一個(gè) 句點(diǎn)(.) 開(kāi)頭,后面是一個(gè)可選的十進(jìn)制整數(shù). 如果未給出整數(shù),精度缺省值為零
對(duì)于d,u,u,o,x,X類(lèi)型的轉(zhuǎn)換,精度字段制定將出現(xiàn)在結(jié)果中的 最小數(shù)字的個(gè)數(shù) 并覆蓋零標(biāo)志. 如果轉(zhuǎn)換后的值的位數(shù)小于寬度,就在它的前面插入零. 如果值為零且精度也為零,則轉(zhuǎn)換結(jié)果就不會(huì)產(chǎn)生數(shù)字.
對(duì)于e,E,f類(lèi)型的轉(zhuǎn)換,精度決定將出現(xiàn)在 小數(shù)點(diǎn)之后的數(shù)字位數(shù) .
對(duì)于g,G類(lèi)型的轉(zhuǎn)換,它制定將出現(xiàn)在結(jié)果中的 最大 有效位數(shù).
當(dāng)使用s類(lèi)型轉(zhuǎn)換時(shí),精度指定將被轉(zhuǎn)換的 最多 的字符數(shù).
Tip
如果用于表示字段寬度 和/或 精度的十進(jìn)制整數(shù)由一個(gè) 星號(hào)(*) 代替, 那么printf的下一個(gè)參數(shù)(必須是個(gè)整數(shù))就提供寬度 和/或 精度. 因此這些值可以通過(guò)計(jì)算活動(dòng)而不必預(yù)先設(shè)定.
printf("%.*s \n", 3, "abcdef"); // abc (相當(dāng)于%.3s)
printf("%0*s \n", 5, "abc"); // 00abc (相當(dāng)于%05s)
printf("%0*.*s \n", 5, 3, "abcdef"); // 00abc (相當(dāng)于%05.3s)
修改符[{hh | h | l | ll | j | z | t | L}]
C99
To specify |
Use prefix |
With type specifier |
Compiler |
signed char |
hh |
d, i, o, x, or X |
GCC |
unsigned char |
hh |
o, u, x, or X |
GCC |
short int |
h |
d, i, o, x, or X |
GCC VS |
unsigned short int |
h |
o, u, x, or X |
GCC VS |
long int |
l (lowercase L) |
d, i, o, x, or X |
|
unsigned long int |
l |
o, u, x, or X |
|
wint_t |
l |
c |
|
wchar_t |
l |
s |
|
long long int |
ll |
d, i, o, x, or X |
|
unsigned long long int |
l |
o, u, x, or X |
|
long double |
l or L |
a, A, e, E, f, f, g, or G |
|
- l
- 修改符 對(duì) a, A, e, E, f, F, g,or G 類(lèi)型 無(wú)效,。
- j (GCC)
- Speci?es that a following d, i, o, u, x,or X conversion speci?er applies to an intmax_t or uintmax_t argument; or that a following n conversion speci?er applies to a pointer to an intmax_t argument. 表明接下來(lái)的d,i,o,u,x或X轉(zhuǎn)換說(shuō)明符會(huì)應(yīng)用于intmax_t或uintmax_t參數(shù),, 或者表明接下來(lái)的轉(zhuǎn)換說(shuō)明符n會(huì)應(yīng)用于一個(gè)只想intmax_t參數(shù)的指針
- z (GCC)
- Speci?es that a following d, i, o, u, x,or X conversion speci?er applies to a size_t or the corresponding signed integer type argument; or that a following n conversion speci?er applies to a pointer to a signed integer type corresponding to size_t argument. 表明接下來(lái)的轉(zhuǎn)換說(shuō)明符d,i,o,,u,x或X會(huì)應(yīng)用于一個(gè)size_t或?qū)?yīng)的有符號(hào)整數(shù)類(lèi)型的參數(shù); 或者表明接下來(lái)的轉(zhuǎn)換說(shuō)明符n會(huì)應(yīng)用于一個(gè)指針,該指針指向一個(gè)對(duì)應(yīng)于size_t類(lèi)型的參數(shù)的有符號(hào)整數(shù)類(lèi)型
- t (GCC)
- Speci?es that a following d, i, o, u, x,or X conversion speci?er applies to a ptrdiff_t or the corresponding unsigned integer type argument; or that a following n conversion speci?er applies to a pointer to a ptrdiff_t argument. 表明接下來(lái)的轉(zhuǎn)換說(shuō)明符d,i,o,,u,x或X會(huì)應(yīng)用于ptrdiff_t或相應(yīng)的無(wú)符號(hào)整數(shù)類(lèi)型的參數(shù),; 或者表明接下來(lái)的n會(huì)應(yīng)用于一個(gè)指向ptrdiff_t類(lèi)型的參數(shù)的指針
MS VC++
- 數(shù)值類(lèi)型
-
To specify |
Use prefix |
With type specifier |
long int |
l (lowercase L) |
d, i, o, x, or X |
long unsigned int |
l |
o, u, x, or X |
long long |
ll |
d, i, o, x, or X |
short int |
h |
d, i, o, x, or X |
short unsigned int |
h |
o, u, x, or X |
__int32 |
I32 |
d, i, o, x, or X |
unsigned __int32 |
I32 |
o, u, x, or X |
__int64 |
I64 |
d, i, o, x, or X |
unsigned __int64 |
I64 |
o, u, x, or X |
ptrdiff_t |
I |
d, i, o, x, or X |
size_t |
I |
o, u, x, or X |
long double |
l or L |
f |
- ptrdiff_t
- (that is, __int32 on 32-bit platforms, __int64 on 64-bit platforms)
- size_t
- (that is, unsigned __int32 on 32-bit platforms, unsigned __int64 on 64-bit platforms)
- 字符類(lèi)型
-
To specify |
Use prefix |
With type specifier |
Single-byte character with printf functions |
h |
c or C |
Single-byte character with wprintf functions |
h |
c or C |
Wide character with printf functions |
l |
c or C |
Wide character with wprintf functions |
l |
c or C |
Single-byte – character string with printf functions |
h |
s or S |
Single-byte – character string with wprintf functions |
h |
s or S |
Wide-character string with printf functions |
l |
s or S |
Wide-character string with wprintf functions |
l |
s or S |
Wide character |
w |
c |
Wide-character string |
w |
s |
- 字符類(lèi)型等同于
-
To print character as |
Use function |
With format specifier |
single byte |
printf |
c, hc, or hC |
single byte |
wprintf |
C, hc, or hC |
wide |
wprintf |
c, lc, lC, or wc |
wide |
printf |
C, lc, lC, or wc |
參考資料
|