易百教程

输出格式化规范

格式化输出有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规范将输出一个十进制整数,它的符号始终显示,并在字符宽度为十个字符时左对齐。
# 前缀为0x0X的十六进制输出值(对应于xX转换分别为类型规范),八进制值为0,始终在浮点值中包含小数点。不要删除gG规格的尾随零。
0 在右对齐数值输出值中使用0作为左侧的填充字符。 例如,%012d将输出一个十进制整数右对齐,字段宽度为12个字符,必要时用零填充到左侧。 如果为整数输出指定了精度,则忽略0标志。

[width]指定输出值的最小字段宽度。如果值不符合指定的最小宽度,则将超出指定的宽度。
[.precision]指定输出中小数点后面的浮点值的位数。例如,%15.6f输出一个浮点值,最小字段宽度为15个字符,小数点后面有六个位置。对于整数转换,它指定最小位数。
[size_flag]是修改类型规范含义值的大小规范。可能的大小规范是:

标志 表示含意
l(小写的L字符) 指定diuoxX转换类型适用于参数输入longunsigned long。 当应用于类型n转换时,参数是类型long *。当应用于类型c转换时,参数是类型wint_t。 申请时对于类型转换,参数是类型wchar_t *
L 指定以下浮点转换说明符适用于long double参数。
ll(小写的LL字符) 指定diuoxX转换类型适用于long longunsigned long long类型的参数。 应用于类型n转换时,参数的类型为long long *
h 指定diuoxX转换类型适用于shortunsigned short类型的参数。 应用于类型n转换时,参数类型为short *
hh 指定diuoxX转换类型适用于signed char或unsigned char类型的参数。应用于类型n转换时,参数的类型为signed char *
j 指定diuoxX转换类型适用于类型的参数intmax_tuintmax_t。 应用于n转换时,参数的类型为intmax_t *
z 指定diuoxX转换类型适用于size_t类型的参数。 应用于n转换时,参数的类型为size_t *
t 指定diuoxX转换类型适用于ptrdiff_t类型的参数。 应用于n转换时,参数的类型为ptrdiff_t *
type 一个字符,指定要作为输出应用于值的转换类型。
d, i 假定该值为int类型,输出为带符号十进制整数。
u 假定该值为unsigned int类型,输出为无符号十进制整数。
o 对于unsigned int类型,输出为unsigned八进制值。
xX 对于unsigned int类型,输出为无符号十六进制值。 如果使用小写字母转换规范,则使用十六进制数字af,否则使用AF
c 对于char类型,输出是一个字符。
aA 对于double类型,输出是十六进制科学记数法(带指数)的浮点值。使用小写字母转换时,输出中的指数值将以p开头,否则为P。大写十六进制数字用于输出A和小写用a
eE 对于double类型,输出为十进制科学记数法(带指数)的浮点值。 使用小写类型转换时,输出中的指数值将以e开头,否则为E
fF 对于double类型,输出是普通表示法中的浮点值(没有指数)。
gG 对于double类型,输出是普通表示法(没有指数)的浮点值,除非指数值大于精度(默认值6)或小于-4,在这种情况下输出将用科学记数法表示。
s 对于以null结尾的字符串char和字符的字符串输出,直到找到空字符或直到达到精度规范(如果存在)。可选的精度规范表示可输出的最大字符数。
p 对于指针,并且因为输出是地址,它将是十六进制值。
n 对于int *类型的指针,到目前为止输出中的字符数存储在参数指向的地址。不能将此选项与格式化输出的可选库函数一起使用。
% 没有参数,输出是%字符。