printf用法详解
printf用法详解
printf简介
printf是C语言中的格式化输出函数,由于它灵活的格式化输出功能,在C++代码编写时也很常用。
printf包含于头文件iostream
或stdio.h
中。
printf的函数原型:
1 | int printf(const char *restrict format, ...); |
printf的调用格式:
1 | printf("%[flags][width][.precision][length]type", ...); |
即:
1 | printf("%[标志][最小宽度][.精度][类型长度]类型", ...); |
这里的”%[标志][最小宽度][.精度][类型长度]类型”指的是格式控制字符串,请参见下一部分。
格式控制字符串
格式控制字符串是printf函数中的第一个部分,它本质作为字符串,由""
括起,其中包含以%
开头、后面接各种控制字符的占位符,例如%d
、%lf%
。
类型(type)
使用printf时首先要说明类型,因为类型是格式控制字符串必不可少的组成部分,其它的选项都是可选的。类型用于规定输出数据的类型,常用的含义如下:
类型 | 说明 |
---|---|
%hd、%d、%ld | 以十进制、有符号的形式输出 short、int、long 类型的整数 |
%f、%lf | 以十进制的形式输出 float、double 类型的小数 |
%e、%le %E、%lE |
以指数的形式输出 float、double 类型的小数。输出结果中的 e 或 E 的大小写与格式控制符保持一致 |
%s | 输出一个字符串 |
%c | 输出一个 char 类型的单一字符 |
还有一些不常用的:
类型 | 说明 |
---|---|
%hu、%u、%lu | 以十进制、无符号的形式输出 short、int、long 类型的整数 |
%ho、%o、%lo | 以八进制、不带前缀、无符号的形式输出 short、int、long 类型的整数 |
%#ho、%#o、%#lo | 以八进制、带前缀、无符号的形式输出 short、int、long 类型的整数 |
%hx、%x、%lx %hX、%X、%lX |
以十六进制、不带前缀、无符号的形式输出 short、int、long 类型的整数。输出结果中的 x 或 X 的大小写与格式控制符保持一致 |
%#hx、%#x、%#lx %#hX、%#X、%#lX |
以十六进制、带前缀、无符号的形式输出 short、int、long 类型的整数。输出结果中的 x 或 X 的大小写与格式控制符保持一致 |
示例1:
1 | printf("%d", 5); |
输出:
1 | 5 |
示例2:
1 | printf("%d%d", 5, 10); |
输出:
1 | 510 |
示例3:
1 | printf("%lf", 5.123); |
输出:
1 | 5.123000 |
注意:使用
%f
或%lf
时如果不指明精度会默认输出保留到小数点后6位
标志(flags)
标志 | 描述 |
---|---|
- | 在给定的字段宽度内左对齐,右边填充空格(默认右对齐) |
+ | 强制在结果之前显示加号或减号(+ 或 -),即正数前面会强制显示 + 号 |
(空格) | 输出值为正时加上空格,为负时加上负号 |
# | 类型是 o、x、X 时,增加前缀 0、0x、0X; 类型是 e、E、f、g、G 时,一定使用小数点; 类型是 g、G 时,尾部的 0 保留 |
0 | 对于所有的数字格式,使用前导零填充字段宽度(如果出现了减号标志或者指定了精度,则忽略该标志) |
示例4:
1 | for(int i = 1; i <= 10; ++i) printf("%-5d", i); |
输出:
1 | 1 2 3 4 5 6 7 8 9 10 |
示例5:
1 | for(int i = 1; i <= 10; ++i) printf("%5d", i); |
输出:
1 | 1 2 3 4 5 6 7 8 9 10 |
示例6:
1 | for(int i = 1; i <= 10; ++i) printf("%05d", i); |
输出:
1 | 00001000020000300004000050000600007000080000900010 |
输出最小宽度(width)
用十进制整数来表示输出的最少位数。若实际位数多于指定的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。一些例子在示例4、示例5、示例6均已体现。
输出最小宽度 | 说明 |
---|---|
数值 | 十进制整数 |
* | 星号。不显示指明输出最小宽度,而是以星号代替,在printf的输出参数列表中给出 |
示例7:
1 | printf("%0*d", 6, 1000); //此时的 * 指的就是 6 |
输出:
1 | 001000 |
精度(.precision)
精度格式符以.
开头,后接十进制整数。
精度 | 说明 |
---|---|
.数 | 对于整数说明符(d、i、o、u、x、X):precision 指定了要打印的数字的最小位数。如果写入的值短于该数,结果会用前导零来填充。如果写入的值长于该数,结果不会被截断。精度为 0 意味着不写入任何字符; 对于 e、E 和 f 说明符:要在小数点后输出的小数位数; 对于 g 和 G 说明符:要输出的最大有效位数;对于 s 说明符: 要输出的最大字符数。默认情况下,所有字符都会被输出,直到遇到末尾的空字符; 对于 c 说明符:没有任何影响; 当未指定任何精度时,默认为 1。如果指定时只使用点而不带有一个显式值,则标识其后跟随一个 0。 |
.* | 用 * 代替数值,用法与输出最小宽度(width)中 * 的用法一样 |
示例8:
1 | printf("%.6f", 3.1415926); |
输出:
1 | 3.141593 |
注意:浮点数和整数会四舍五入。
示例9:
1 | printf("%.8s", “abcdefghij”); |
输出:
1 | abcdefgh |
转义字符
转义字符 | 意义 |
---|---|
\n | 换行符 |
\a | 警报(响铃)符 |
\b | 回退符 |
\f | 换页符 |
\r | 回车符 |
\t | 横向制表符 |
\v | 纵向制表符 |
\\ | 反斜杠 |
\” | 双引号 |
示例10:
1 | printf("%d\n", 123); |
输出:
1 | 123 |
其他
打印较长字符串
有时printf语句很长,不能在一行被放下,影响代码美观,那么下面提供2种分割字符串的方式。
使用反斜杠
\
和回车的方式分割,回车后下一行要从最左侧开始;1
2
3
4
5
6
7
8
using namespace std;
int main() {
printf("Hello \
World!");
return 0;
}输出:
1
Hello World!
使用字符串拼接,可以换行或者空格:
1
2
3
4
5
6
7
8
using namespace std;
int main() {
printf("Hello "
"World!");
return 0;
}输出:
1
Hello World!
对printf的理解
我们通过下面这个示例通俗地理解一下printf的底层逻辑:
示例11:
1 | printf("There is %d,then is %d.", 123, 456); |
输出:
1 | There is 123,then is 456. |
事实上,printf函数输出的就是最前面的那段用""
括起来的字符串,%
以及后面接的各种格式控制字符串指向了输出表列的地址,程序通过检测%
寻找占位符,并根据不同的占位符将后面输出表列的内容当作字符串输出。
也就是说,在上面示例11中,第一个&d
其实就相当于123
,第二个&d
其实就相当于456
。
以上就是全部关于printf函数的详细用法了,感谢你的阅读,再见!