1. printf() 简介
printf函数称为格式输出函数,是一个标准库函数,用于将格式化后的字符串输出到标准输出,它的函数原型在头文件“stdio.h”中。
2. printf()函数调用的一般形式
调用格式:
printf("格式化字符串", 输出表列);
格式化字符串包含三种对象,分别为:
(1)字符串常量:原样输出,在显示中起提示作用。
(2)格式控制字符串:用于指定输出格式。
(3)转义字符:在字符串中会被自动转换为相应操作命令。
3.格式控制字符串详解
printf() 的格式控制字符串组成如下:
%[flags] [width] [.prec] [length] type
%[标志] [最小宽度] [.精度] [类型长度] 类型
3.1 标志(flags)
标志(flags)规定输出的样式和取值,具体如下:
字符 | 含义 | 示例 | 结果 |
---|---|---|---|
- | 结果左对齐,右边填空格 (默认是右对齐,左边填空格) | printf("%-5d\n",1234); printf("%5d\n",1234); | 1234 1234 |
+ | 输出符号(正号或负号) | printf("%+d %+d\n",1234,-1234); | +1234 -1234 |
空格 | 输出值为正时加上空格,为负时加上负号 | printf("% d % d\n",1234,-1234); | 1234 -1234 |
# | type是o、x、X时,增加前缀0、0x、0X type是e、g、f时,结果有小数时才给出小数点 | printf("%x %#x\n",1234,1234); printf("%g %#g\n",1000.0,1000.0); | 3e8 0x3e8 1000 1000.0 |
0 | 将输出的前面补上0,直到占满指定列宽为止 (不可以搭配使用“-”) | printf("%05d\n",123); | 00123 |
3.2 最小宽度(width)
用十进制整数来表示输出的最少位数。若实际位数多于指定的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。
具体如下:
width | 描述 | 示例 | 结果 |
---|---|---|---|
数值 | 十进制数 | printf("%06d",1000); | 001000 |
* | 不显示指明输出最小宽度,而是以星号代替,在printf的输出参数列表中给出 | printf("%0*d",6,1000); | 001000 |
3.3 精度(.precision)
精度格式符以“.”开头,后跟十进制整数。
具体取值如下:
.precision | 含义 | 示例 | 结果 |
---|---|---|---|
.数值 | 十进制数 (1)对于整型(d,i,o,u,x,X),precision表示输出的最小的数字个数,不足补前导零,超过不截断。 (2)对于浮点型(a, A, e, E, f), precision表示小数点后数值位数,默认为六位,不足补后置0,超过则截断。 (3)对于类型说明符g或G,表示可输出的最大有效数字。 (4)对于字符串(s),precision表示最大可输出字符数,不足正常输出,超过则截断。 (5)precision不显示指定,则默认为0 | printf("%.8d\n",1000); printf("%.8f\n",1000.123456789); printf("%.8f\n",1000.123456) printf("%.8g\n",1000.123456); printf("%.8s\n",“abcdefghij”); | 00001000 1000.12345679 1000.12345600 1000.1235 abcdefgh |
.* | 以星号代替数值,类似于width中的*,在输出参数列表中指定精度。 | printf("%.*d\n",8,1000); | 00001000 |
注意: 在对浮点数和整数截断时,存在四舍五入。
3.4 类型长度(length)
类型长度(length)指明待输出数据的长度。
具体如下:
length | 含义 | 占用字节数 | 示例 | 结果 |
---|---|---|---|---|
hh | 将相应的参数按 signed char 或 unsigned char 类型输出 | 1 | printf("%hhd",'A'); | 65 |
h | 将相应的参数按 short 或 unsigned short 类型输出 | 2 | printf("%hd\n",32767); printf("%hd\n",65535); | 32767 -1 |
l | 相应的参数按 long 或 unsigned long 类型输出 | 4 | printf("%ld\n",0x7fffffff); printf("%ld\n",0xffffffff); | 2147483647 -1 |
ll | 将相应的参数按 long long 或 unsigned long long 类型输出 | 8 | printf("%lld\n",0x7fffffffffffffff); printf("%lld\n",0xffffffffffffffff); | 9223372036854775807 -1 |
3.5 类型(type)
类型(type)用于规定输出数据的类型。
具体含义如下:
字符 | 对应数据类型 | 含义 | 示例 | 结果 |
---|---|---|---|---|
d | int | 有符号10进制整数 | printf("%d",520); | 520 |
o | unsigned int | 无符号8进制整数 | printf("%o",520); | 1010 |
u | unsigned int | 无符号10进制整数 | printf("%u",520); | 520 |
x | unsigned int | 无符号16进制整数(小写abcdef) | printf("0x%x",123); | 0x7b |
X | unsigned int | 无符号16进制整数(大写ABCDEF) | printf("0X%X",123); | 0X7B |
f | float(double) | 浮点数(包括float和doulbe) | printf("%06.2f",13.14); | 013.14 |
a | float(double) | 16进制p计数法输出浮点数(小写) | printf("%a",15.15); | 0x1.e4cccdp+3 |
A | float(double) | 16进制p计数法输出浮点数(大写) | printf("%A",15.15); | 0X1.E4CCCDP+3 |
e | float(double) | 科学计数法,使用指数(Exponent)表示浮点数(小写) | printf("%e",0.000000123); | 1.230000e-007 |
E | float(double) | 科学计数法,使用指数(Exponent)表示浮点数(大写) | printf("%E",0.000000123); | 1.230000E-007 |
g | float(double) | 根据数值的长度,选择以最短的方式输出(小写) | printf("%g\n%g",0.000000123,0.123); | 1.23e-007 0.123 |
G | float(double) | 根据数值的长度,选择以最短的方式输出(大写) | printf("%G\n%G",0.000000123,0.123); | 1.23E-007 0.123 |
c | char | 字符型。可以把输入的数字按照ASCII码相应转换为对应的字符 | printf("%c\n",65,); printf("%c\n",'A',); | A A |
s | char* | 字符串。输出字符串中的字符直至字符串中的空字符(字符串以空字符’\0‘结尾) | printf("%s\n","测试test \0 12345"); | 测试test |
p | void* | 以16进制形式输出指针 | printf("0x%p","MQ"); | 0x0040303D |
% | 字符% | 输出字符‘%’(百分号)本身 | printf("%d%%",20); | 20% |
4.转义字符
转义字符在字符串中会被自动转换为相应操作命令。printf() 使用的常见转义字符如下:
转义字符 | 含义 |
---|---|
\a | 警报(响铃)符 |
\b | 回退符 |
\f | 换页符 |
\n | 换行符 |
\r | 回车符 |
\t | 横向制表符 |
\v | 纵向制表符 |
\ \ | 反斜杠 |
\ ’ | 单引号 |
\“ | 双引号 |
\? | 问号 |
\0 | 空字符 |