函数
printf //头文件intclude “stdio.h”
int printf ( const char * format, ... );
描述
将格式化数据打印到标准输出,按格式指向的 C 字符串写入标准输出 (stdout)。如果 format 包含格式说明符(以%开头的子序列),则格式后面的其他参数将被格式化并插入到生成的字符串中,替换其各自的说明符。
参数
format
C 字符串,包含要写入stdout的文本。 它可以选择性地包含嵌入的格式说明符,这些说明符由后续附加参数中指定的值替换,并根据请求设置格式。
格式说明符遵循此原型: [请参阅下面的兼容性说明]
%[flags][width][.precision][length]specifier
%[标志][宽度][.精度][长度]说明符,其中末尾的说明符
其中,末尾的说明符字符[specifier]是最重要的组件,因为它定义了类型和相应参数的解释:
说明符/specifier | Output | Example |
---|---|---|
d or 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 或 %f | 392.65 |
G | 使用最短表示形式:%E 或 %F | 392.65 |
a | 十六进制浮点数,小写 | -0xc.90fep-2 |
A | 十六进制浮点数,大写 | -0XC.90FEP-2 |
c | 字符 | a |
s | 字符串 | sample |
p | 指针地址 | b8000000 |
n | 没有打印任何内容。相应的参数必须是指向有符号 int 的指针。到目前为止写入的字符数存储在指向的位置。 | |
% | 一个 % 后跟另一个 % 字符会将单个 % 写入流 | % |
格式说明符还可以包含子说明符:标志、宽度、.精度和修饰符[flags, width, .precision and modifiers](按此顺序),它们是可选的,并遵循以下规范:
标志/flags | 描述 |
---|---|
- | 在给定字段宽度内左对齐;右对齐是默认值(请参阅宽度子说明符)。 |
+ | 即使在正数中,也会在结果前面加上加号或减号(+或-)。默认情况下,只有负数前面带有 - 符号。 |
(空格) | 如果不打算写入任何符号,则会在值之前插入一个空格。 |
# | 与 o、x 或 X 说明符一起使用时,对于小于零的值,值前面分别带有 0、0x 或 0X。与 a、A、e、E、f、F、g 或 G 一起使用时,它强制写入输出包含小数点,即使后面没有更多的数字。 默认情况下,如果没有数字后跟,则不写入小数点。 |
0 | 指定填充时,用零 (0) 而不是空格左填充数字(请参阅宽度子说明符)。 |
宽度/width | 描述 |
---|---|
(数字) | 要打印的最小字符数。如果要打印的值小于此数字,则用空格填充结果。即使结果更大,也不会截断该值。 |
* | 宽度不是在格式字符串中指定的,而是作为必须格式化的参数之前的附加整数值参数指定的。 |
.精度/.precision | 描述 |
---|---|
.数 | 对于整数说明符 (d, i, o, u, x, X):精度指定要写入的最小位数。如果要写入的值短于此数字,则结果将用前导零填充。即使结果较长,也不会截断该值。精度为 0 表示不为值 0 写入任何字符。对于 a、a、e、e、f 和 F 说明符:这是小数点后要打印的位数(默认情况下为 6)。对于 g 和 G 说明符:这是要打印的最大有效位数。对于 s:这是要打印的最大字符数。默认情况下,将打印所有字符,直到遇到结尾空字符。如果在指定期间时没有显式精度值,则假定为 0。 |
.* | 精度不是在格式字符串中指定的,而是作为必须格式化的参数之前的附加整数值参数指定的。 |
长度子说明符修改数据类型的长度。这是一个图表,显示用于解释带有和不带有长度说明符的相应参数的类型(如果使用不同的类型,则执行正确的类型提升或转换(如果允许):
说明符 | |||||||
---|---|---|---|---|---|---|---|
长度/length | d i | u o x X | f F e E g G a A | c | s | p | n |
(none) | int | unsigned int | double | int | char* | void* | int* |
hh | signed char | unsigned char | signed char* | ||||
h | short int | unsigned short int | short int* | ||||
l | long int | unsigned long int | wint_t | wchar_t* | long int* | ||
ll | long long int | unsigned long long int | long long int* | ||||
j | intmax_t | uintmax_t | intmax_t* | ||||
z | size_t | size_t | size_t* | ||||
t | ptrdiff_t | ptrdiff_t | ptrdiff_t* | ||||
L | long double |
关于说明符的注意事项:它接受 int(或 wint_t)作为参数,但在格式化输出之前执行对 char 值(或 wchar_t)的正确转换。
... (additional arguments)
根据格式字符串,函数可能需要一系列附加参数,每个参数都包含一个值,用于替换格式字符串中的格式说明符(或指向 n 的存储位置的指针)。
这些参数的数量至少应与格式说明符中指定的值数一样多。函数会忽略其他参数。
返回值
成功后,将返回写入的字符总数。 如果发生写入错误,则设置错误指示器(ferror)并返回负数。
如果在写入宽字符时发生多字节字符编码错误,errno 将设置为 EILSEQ 并返回负数。
例
/* printf example */
#include <stdio.h>
int main()
{
printf ("Negative number: %-d\n", -10);
printf ("Characters: %c %c \n", 'a', 18);
printf ("Decimals: %d %ld\n", 18, 650000L);
printf ("Preceding with blanks: %10d \n", 18);
printf ("Preceding with zeros: %010d \n", 18);
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;
}
输出:
Negative number: -10
Characters: a
Decimals: 18 650000
Preceding with blanks: 18
Preceding with zeros: 0000000018
Some different radices: 100 64 144 0x64 0144
floats: 3.14 +3e+00 3.141600E+00
Width trick: 10
A string