printf用法详解

printf简介

printf是C语言中的格式化输出函数,由于它灵活的格式化输出功能,在C++代码编写时也很常用。
printf包含于头文件iostreamstdio.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
2
printf("%d\n", 123);
printf("%d", 456);

输出:

1
2
123
456

其他

打印较长字符串

有时printf语句很长,不能在一行被放下,影响代码美观,那么下面提供2种分割字符串的方式。

  1. 使用反斜杠\和回车的方式分割,回车后下一行要从最左侧开始;

    1
    2
    3
    4
    5
    6
    7
    8
    #include <iostream>
    using namespace std;

    int main() {
    printf("Hello \
    World!");
    return 0;
    }

    输出:

    1
    Hello World!
  2. 使用字符串拼接,可以换行或者空格:

    1
    2
    3
    4
    5
    6
    7
    8
    #include <iostream>
    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函数的详细用法了,感谢你的阅读,再见!