格式化输出到标准流的主要函数是printf()
。stdio.h
头文件也可以使用printf_s()
函数,它是printf()
的安全版本。
printf_s()
不允许%n
输出规范包含在格式字符串中。%n
输出将数据写入内存,这使其不安全。
要使用printf_s()
函数,则必须在库头的#include
指令之前将符号__STDC_WANT_LIB_EXT1__
定义为1
才能使可选的安全库函数可用。
printf_s()
函数的原型是:
int printf_s(char *format, ...);
第一个参数是格式控制字符串。
函数的可选参数是要按顺序输出的值。它们必须在数字和类型上与格式字符串中出现的格式转换说明符相对应。下表显示了可选输出标志字符如何影响输出。
字符 | 用法 |
---|---|
+ |
确保在有符号输出值之前始终存在加号或减号。默认情况下,只有负值具有符号。 |
- |
输出值左对齐,右边用空格填充。输出的默认定位是右对齐的。 |
0 |
指定应使用零填充整数或浮点值而不是空格以填充左侧的字段宽度。 |
# |
确保:0 是在八进制输出值之前,0x 或0X 是在十六进制输出值之前,浮点输出值将包含一个小数点,对于g 或G 浮点转换字符,尾随零将不是省略。 |
空格 | 指定正值或零值前面有空格而不是加号。 |
可选的field_width
指定输出值的最小字段宽度。如果值需要更多字符,则只需展开字段。
例如,如果字段宽度前面带有0
标志,则在09
中,输出将在左侧用零填充。可选的精度说明符与浮点输出值一起使用,由一个句点后跟一个整数组成。.n
的说明符表示要为浮点值输出n
个小数位。如果要输出的值超过n
个有效数字,则它是四舍五入的。如果将其用于整数转换,则指定输出中显示的最小位数。
可选的大小标志如下表所示。
标志 | 效果 |
---|---|
h |
以下整数转换说明符适用于short 或unsigned short 参数。 |
hh |
以下整数转换说明符适用于signed char 或unsigned char 参数。 |
l (大写L 字母) |
以下整数转换说明符适用于long 或unsigned long 参数。 |
ll (大写LL 字母) |
以下整数转换说明符适用于long long 或unsigned long long 参数。 |
j |
以下整数转换说明符适用于intmax_t 或uintmax_t 参数。 |
z |
以下整数转换说明符适用于size_t 参数。 此标志避免了由于size_t 是实现定义的整数类型而可能出现的潜在编译器警告。 |
t |
以下整数转换说明符适用于ptrdiff_t 参数。 |
L |
以下浮点转换说明符适用于long double 参数。 |
转换字符定义如何为特定类型的值转换输出,整数转换字符在下表中定义。
转换字符 | 产生输出 |
---|---|
d 或 i |
有符号十进制整数 |
o |
无符号八进制整数 |
u |
无符号十进制整数 |
x |
无符号十六进制整数,带小写十六进制数字:a ,b ,c ,d ,e ,f |
X |
作为x 但具有大写十六进制数字A ,B ,C ,D ,E ,F |
浮点转换字符在下表中定义。
转换字符 | 产生输出 |
---|---|
f 或 F |
有符号十进制值 |
e |
带指数的带符号十进制值 |
E |
与e 一样,但用E 表示指数而不是e |
g |
与e 一样,或f 取决于值的大小和精度 |
G |
与g 一样,但是E 代表指数值 |
a 或 A |
以十六进制形式呈现double 值,十六进制尾数值前面带有0x 或0X ,任何指数前缀为p 或P ,因此:0xh.hhhhp +/-d 其中h 是十六进制数字。 |
指针转换字符在下表中定义。
转换字符 | 产生输出 |
---|---|
p |
输出参数的值作为指针,值以实现定义的方式显示。 参数应为void * 类型。 |
字符转换字符在下表中定义。
转换字符 | 产生输出 |
---|---|
c |
单个字符或精确字符 |
s |
到达'\0' 之前的所有字符或输出精确字符 |
%n
说明符仅适用于printf()
。
相应的参数必须是int *
类型,%n
的效果是存储到目前为止写入标准输出的字符数。