printf函数提供格式化输出转换
函数包含在头文件 <stdio.h> 中
#include <stdio.h>
......
函数的原型在头文件的声明为
_CRTIMP __cdecl __MINGW_NOTHROW int printf (const char *, ...);
第一个参数 const char * 来指明输出的格式 , 按照格式对输出进行转换, 并写到标准输出流中(stdin),后面的三个点 . . . 表示此处的参数是可变参数,这样可以满足不同的输出需求
如果打印输出成功函数返回打印的字节数(函数返回值为 int 类型), 如果出错则返回一个负值
1 #include <stdio.h>
2
3 int main()
4 {
5 int i = printf("你好
");
6 printf("%d
", i);
7 return 0;
8 }
输出
你好
5
成功输出 你好 并且返回打印的字符个数 5 (一个汉字的编码占2个字节 * 2 + ' '一个字节 = 5)
格式串由两种类型对象组成:
----- 普通字符(将被复制到输出流中)
----- 转换说明(分别决定下一个后续参数的转换和打印), 每个转换说明均以 % 开头, 以转换字符结束, 在%与转换字符之间可以一次包括下列内容
- 标志
- 指定被转换的参数在其字段内左对齐
1 #include <stdio.h> 2 3 int main() 4 { 5 printf("%20s ", "hello world "); 6 printf("%-20s ", "hello world "); 7 return 0; 8 }
输出
hello world
hello world
+ 只定在输出的数前面加上正负号
1 #include <stdio.h> 2 3 int main() 4 { 5 int i = printf("%20s ", "hello world "); 6 printf("%d ", i); 7 printf("%+d ", i); 8 printf("%+d ", -i); 9 return 0; 10 }
输出
hello world 21 +21 -21
空格 如果第一个字符不是正负号, 则在它的前面加上空格
1 #include <stdio.h> 2 3 int main() 4 { 5 int i = printf("%20s ", "hello world "); 6 printf("%d ", i); 7 printf("%+d ", i); 8 printf("%+d ", -i); 9 printf("%+ d ", -i); 10 printf("% d ", i); 11 return 0; 12 }
输出
hello world 21 +21 -21 -21 21
0 对于数制转换, 当输出长度小于字段宽度时, 在前面添加 0 作为填充
1 #include <stdio.h> 2 3 int main() 4 { 5 int i = printf("%20s ", "hello world "); 6 printf("%06d ", i); 7 return 0; 8 }
输出
hello world
000021
# 指定另一种输出格式。 如果为 o 则第一个数字为0(表示八进制), 如果为 x 或 X , 则指定在输出的非0值前加 0x 或 0X (表示十六进制)
1 #include <stdio.h> 2 3 int main() 4 { 5 int i = printf("你好!!! "); 6 printf("%#o ", i); 7 return 0; 8 }
输出
你好!!!
010
共 8 个字节, 八进制是 010
1 #include <stdio.h> 2 3 int main() 4 { 5 int i = printf("!!!!!!你好!!!!! "); 6 printf("%#x ", i); 7 printf("%#X ", i); 8 return 0; 9 }
输出
!!!!!!你好!!!!!
0x10
0X10
共 16 个字节, 十六进制是 0x10
- 一个数值, 用于指定最小字段宽度
1 #include <stdio.h> 2 3 int main() 4 { 5 printf("%d ", 8); 6 printf("%d ", 9); 7 printf("%d ", 10); 8 printf("%6d ", 8); 9 printf("%6d ", 9); 10 printf("%6d ", 10); 11 return 0; 12 }
输出
8 9 10 8 9 10
当然这里默认是右对齐的
- 点号,用于分隔字段宽度和精度
- 表示精度的数
1 #include <stdio.h> 2 #define PI 3.1415926535897932384626433832795028841971693993751058209 3 int main() 4 { 5 printf("%30.20f ", PI); 6 }
输出
3.14159265358979310000
可以看出双精度浮点型可以精确到小数点后 16 位左右
------------------- 宽度和精度中任何一个或者两个都可以用 * 代替, 通过转换下一个参数计算得到(下一个参数必须为 int 类型)
1 #include <stdio.h> 2 #define PI 3.1415926535897932384626433832795028841971693993751058209 3 int main() 4 { 5 int a = 30, b = 20; 6 printf("%*.*f ", a, b, PI); 7 }
当然结果和上面一样
- 长度修饰符 h , l 或 L 。
h:将相应的参数按照 short 或 unsigned short 类型输出
l:将相应的参数按照 long 或 unsigned long 类型输出
L:将相应的参数按照 long double 类型输出
printf 函数的转换字符(以 % 开头, 如果 % 后面的字符不是转换字符, 则它行为没有定义)
转换字符 | 参数类型, 转换结果 |
d, i | int, 有符号十进制表示 |
o | unsigned int, 无符号八进制表示(无前导0) |
x, X | unsigned int, 无符号十六进制表示(无前导0x和0X)。如果是0x, 则使用abcdef, 如果是0X, 则使用ABCDEF |
u | int, 无符号十进制表示 |
c | int, 转换为unsigned char类型后为一个字符 |
s | char *, 打印字符串中的字符, 知道遇到 ' ' 或者已经打印了有精度指定的字符数 |
f | double, 形式为 [-]mmm.ddd 的十进制表示, 其中, d的数目由精度确定, 默认精度为6, 精度为0时不输出小数点 |
e, E | double, 形式为 [-]m.dddddd e (+/-) xx 或 [-]m.dddddd E (+/-) xx 的十六进制表示, d的数目由精度确定, 默认为6, 精度为0时不输出小数点 |
g, G | double, 当指数小于 -4 或大于等于精度时, 采用 %e 或 %E 的格式, 否则采用 %f 的格式, 尾部的0与小数点不打印 |
p | void *, 打印指针值(具体表示方式与实现有关) |
n | int *, 到目前为止, 此printf调用输出的字符的数目将被写入到相应参数中, 不进行参数转换 |
% | 不进行参数转换, 打印一个符号 % |