函式
<cstdio>

printf

int printf ( const char * format, ... );
將格式化的資料列印到 stdout
format 指向的 C 字串寫入標準輸出(stdout)。如果 format 包含格式說明符(以%開頭的子序列),則 format 之後的附加引數將被格式化並插入到結果字串中,以替換它們各自的說明符。

引數

format
包含要寫入 stdout 的文字的 C 字串。
它可以選擇性地包含嵌入的格式說明符,這些說明符會被後續附加引數中指定的值替換,並按要求進行格式化。

格式說明符遵循此原型:[見下面的相容性說明]
%[標誌][寬度][.精度][長度]說明符

其中,末尾的說明符字元是最重要的部分,因為它定義了其對應引數的型別和解釋
說明符輸出示例
d i有符號十進位制整數392
u無符號十進位制整數7235
o無符號八進位制610
x無符號十六進位制整數7fa
X無符號十六進位制整數(大寫)7FA
f十進位制浮點數,小寫392.65
F十進位制浮點數,大寫392.65
e科學記數法(尾數/指數),小寫3.9265e+2
E科學記數法(尾數/指數),大寫3.9265E+2
g使用最短的表示法%e%f392.65
G使用最短的表示法%E%F392.65
a十六進位制浮點數,小寫-0xc.90fep-2
A十六進位制浮點數,大寫-0XC.90FEP-2
c字元a
s字串sample
p指標地址b8000000
n不列印任何內容。
相應的引數必須是指向signed int.
的指標。到目前為止寫入的字元數將儲存在所指向的位置。
%A%後跟另一個%字元將向流中寫入一個%%

格式說明符還可以包含子說明符:標誌寬度.精度修飾符(按此順序),它們是可選的,並遵循以下規範

標誌描述
-在給定的欄位寬度內左對齊;右對齊是預設設定(參見寬度子說明符)。
+強制在結果前加上正號或負號(+-),即使是正數。預設情況下,只有負數前會加上-號。
(空格)如果值前面不寫入任何符號,則會在值前插入一個空格。
#o, xX說明符一起使用時,對於非零值,值會分別以0, 0x或 0X為字首。
a, A, e, E, f, F, gG它強制輸出結果包含一個小數點,即使後面沒有更多數字。預設情況下,如果後面沒有數字,則不寫入小數點。
0當指定填充時,用零(0)而不是空格來左填充數字(參見寬度子說明符)。

寬度描述
(數字)要列印的最小字元數。如果待列印的值比這個數字短,則結果將用空格填充。即使結果更長,值也不會被截斷。
*寬度不是在格式字串中指定的,而是作為一個額外的整數值引數,位於需要格式化的引數之前。

.精度描述
.數字對於整數說明符(d, i, o, u, x, X):精度指定要寫入的最小位數。如果待寫入的值比這個數字短,則結果將用前導零填充。即使結果更長,值也不會被截斷。精度0意味著對於值0.
不寫入任何字元。對於a, A, e, E, fF說明符:這是要在小數點列印的位數(預設為 6)。
不寫入任何字元。對於gG說明符:這是要列印的最大有效數字位數。
不寫入任何字元。對於s:這是要列印的最大字元數。預設情況下,所有字元都會被列印,直到遇到結尾的空字元。
如果指定了句點但沒有明確的精度值,則假定精度0
.*精度不是在格式字串中指定的,而是作為一個額外的整數值引數,位於需要格式化的引數之前。

長度子說明符修改資料型別的長度。這是一個圖表,顯示了在使用和不使用長度說明符時,用於解釋相應引數的型別(如果使用了不同的型別,並且允許,則會執行適當的型別提升或轉換)
說明符
長度d iu o x Xf F e E g G a Acspn
(無)intunsigned intdoubleintchar*void*int*
hhsigned charunsigned charsigned char*
hshort intunsigned short intshort int*
llong intunsigned long intwint_twchar_t*long int*
lllong long intunsigned long long intlong long int*
jintmax_tuintmax_tintmax_t*
zsize_tsize_tsize_t*
tptrdiff_tptrdiff_tptrdiff_t*
Llong double
關於 c 說明符的說明:它接受一個int(或 wint_t)作為引數,但在格式化輸出之前會將其正確轉換為一個char值(或一個wchar_t)。

注意: 黃色行表示由 C99 引入的說明符和子說明符。有關擴充套件型別的說明符,請參見 <cinttypes>
... (附加引數)
根據格式字串,函式可能需要一系列附加引數,每個引數包含一個用於替換格式字串中格式說明符的值(或者,對於n).
,是指向儲存位置的指標)。這些引數的數量應至少與格式說明符中指定的值的數量一樣多。額外的引數會被函式忽略。

返回值

成功時,返回寫入的字元總數。

如果發生寫入錯誤,則會設定錯誤指示符ferror)並返回一個負數。

如果在寫入寬字元時發生多位元組字元編碼錯誤,errno 會被設定為EILSEQ並返回一個負數。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* printf example */
#include <stdio.h>

int main()
{
   printf ("Characters: %c %c \n", 'a', 65);
   printf ("Decimals: %d %ld\n", 1977, 650000L);
   printf ("Preceding with blanks: %10d \n", 1977);
   printf ("Preceding with zeros: %010d \n", 1977);
   printf ("Some different radices: %d %x %o %#x %#o \n", 100, 100, 100, 100, 100);
   printf ("floats: %4.2f %+.0e %E \n", 3.1416, 3.1416, 3.1416);
   printf ("Width trick: %*d \n", 5, 10);
   printf ("%s \n", "A string");
   return 0;
}

輸出

Characters: a A
Decimals: 1977 650000
Preceding with blanks:       1977
Preceding with zeros: 0000001977
Some different radices: 100 64 144 0x64 0144
floats: 3.14 +3e+000 3.141600E+000
Width trick:    10
A string


相容性

特定的庫實現可能支援額外的說明符子說明符
此處列出的是最新的 C 和 C++ 標準(均於 2011 年釋出)所支援的,但黃色部分的是在 C99 中引入的(自 C++11 起才要求 C++ 實現支援),可能不被遵循舊標準的庫所支援。

另見