函数
<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++ 实现支持),可能不被遵循旧标准的库所支持。

另见