格式化输出有16
个标准库函数,它们具有以下原型:
int printf(const char* restrict format, ...);
int printf_s(const char* restrict format, ...);
int sprintf(char* restrict str, const char* restrict format,...);
int sprintf_s(char* restrict str, rsize_t n, const char* restrict format, ...);
int snprintf(char * restrict, size_t, const char * restrict, ...);
int snprintf_s(char* restrict str, rsize_t n, const char* restrict format, ...);
int fprintf(FILE* restrict stream, const char* restrict format, ...);
int fprintf_s(FILE* restrict stream, const char* restrict format, ...);
int vfprintf(FILE * restrict, const char * restrict, va_list);
int vsprintf(char * restrict, const char * restrict, va_list);
int vprintf(const char * restrict, va_list);
int vsnprintf(char * restrict, size_t, const char * restrict, va_list);
int vfprintf_s(FILE * restrict, const char * restrict, va_list);
int vprintf_s(const char * restrict, va_list);
int vsnprintf_s(char * restrict, rsize_t, const char * restrict, va_list);
int vsprintf_s(char * restrict, rsize_t, const char * restrict, va_list);
名称以_s
结尾的函数是可选的,它需要将__STDC_WANT_LIB_EXT1__
定义为1
。省略号表示可以提供零个或多个参数。这些函数返回写入的字节数,如果发生错误则返回负值。
格式字符串可以包含写入输出的普通字符,以及用于输出后续参数值的格式规范。输出格式规范始终以%
字符开头,并具有以下一般形式:
%[flags][width][.precision][size_flag]type
方括号内的项都是可选的。唯一的必需位是%
字符。 每个可选部件的可能选择如下:[flags]
是零个或多个转换标志,用于控制输出的显示方式。
可以使用的标志是:
符号 | 表示含意 |
---|---|
+ |
在输出中包含符号,+ 或- 。 例如,%+d 将输出一个十进制整数,并且始终包含符号。 |
空格 | 使用空格或 - 用于符号(即,正值前面有空格)。 当输出列中可能存在正值和负值时,对齐输出非常有用。 例如,%d 将输出一个十进制整数,它带有正值的符号空格。 |
- |
如果需要,左对齐字段宽度中的输出,并向右填充空格。 例如,%-10d 将输出一个整数,作为在十个字符的字段宽度中左对齐的十进制值。 %-+10d 规范将输出一个十进制整数,它的符号始终显示,并在字符宽度为十个字符时左对齐。 |
# |
前缀为0x 或0X 的十六进制输出值(对应于x 和X 转换分别为类型规范),八进制值为0 ,始终在浮点值中包含小数点。不要删除g 和G 规格的尾随零。 |
0 |
在右对齐数值输出值中使用0作为左侧的填充字符。 例如,%012d 将输出一个十进制整数右对齐,字段宽度为12 个字符,必要时用零填充到左侧。 如果为整数输出指定了精度,则忽略0 标志。 |
[width]
指定输出值的最小字段宽度。如果值不符合指定的最小宽度,则将超出指定的宽度。[.precision]
指定输出中小数点后面的浮点值的位数。例如,%15.6f
输出一个浮点值,最小字段宽度为15
个字符,小数点后面有六个位置。对于整数转换,它指定最小位数。[size_flag]
是修改类型规范含义值的大小规范。可能的大小规范是:
标志 | 表示含意 |
---|---|
l (小写的L 字符) |
指定d ,i ,u ,o ,x 或X 转换类型适用于参数输入long 或unsigned long 。 当应用于类型n 转换时,参数是类型long * 。当应用于类型c 转换时,参数是类型wint_t 。 申请时对于类型转换,参数是类型wchar_t * 。 |
L |
指定以下浮点转换说明符适用于long double 参数。 |
ll (小写的LL 字符) |
指定d ,i ,u ,o ,x 或X 转换类型适用于long long 或unsigned long long 类型的参数。 应用于类型n 转换时,参数的类型为long long * 。 |
h |
指定d ,i ,u ,o ,x 或X 转换类型适用于short 或unsigned short 类型的参数。 应用于类型n 转换时,参数类型为short * 。 |
hh |
指定d ,i ,u ,o ,x 或X 转换类型适用于signed char或unsigned char 类型的参数。应用于类型n 转换时,参数的类型为signed char * 。 |
j |
指定d ,i ,u ,o ,x 或X 转换类型适用于类型的参数intmax_t 或uintmax_t 。 应用于n 转换时,参数的类型为intmax_t * 。 |
z |
指定d ,i ,u ,o ,x 或X 转换类型适用于size_t 类型的参数。 应用于n 转换时,参数的类型为size_t * 。 |
t |
指定d ,i ,u ,o ,x 或X 转换类型适用于ptrdiff_t 类型的参数。 应用于n 转换时,参数的类型为ptrdiff_t * 。 |
type |
一个字符,指定要作为输出应用于值的转换类型。 |
d , i |
假定该值为int 类型,输出为带符号十进制整数。 |
u |
假定该值为unsigned int 类型,输出为无符号十进制整数。 |
o |
对于unsigned int 类型,输出为unsigned 八进制值。 |
x 或 X |
对于unsigned int 类型,输出为无符号十六进制值。 如果使用小写字母转换规范,则使用十六进制数字a 到f ,否则使用A 到F 。 |
c |
对于char 类型,输出是一个字符。 |
a 或 A |
对于double 类型,输出是十六进制科学记数法(带指数)的浮点值。使用小写字母转换时,输出中的指数值将以p 开头,否则为P 。大写十六进制数字用于输出A 和小写用a 。 |
e 或E |
对于double 类型,输出为十进制科学记数法(带指数)的浮点值。 使用小写类型转换时,输出中的指数值将以e 开头,否则为E 。 |
f 或F |
对于double 类型,输出是普通表示法中的浮点值(没有指数)。 |
g 或 G |
对于double 类型,输出是普通表示法(没有指数)的浮点值,除非指数值大于精度(默认值6 )或小于-4 ,在这种情况下输出将用科学记数法表示。 |
s |
对于以null 结尾的字符串char 和字符的字符串输出,直到找到空字符或直到达到精度规范(如果存在)。可选的精度规范表示可输出的最大字符数。 |
p |
对于指针,并且因为输出是地址,它将是十六进制值。 |
n |
对于int * 类型的指针,到目前为止输出中的字符数存储在参数指向的地址。不能将此选项与格式化输出的可选库函数一起使用。 |
% |
没有参数,输出是% 字符。 |