C语言printf()用法大全(非常详细)
printf 是 print format 的缩写,意思是格式化打印,也就是向控制台上格式化输出数据。
argument 表示将要输出的数据,多份数据以
printf() 会将 argument 格式化,并插入到 format 字符串中,代替对应的格式说明符。
严格来说,printf() 是向标准输出文件中输出数据,而这个标准输出文件通常来说都是“黑底白字”的控制台,或者说是显示器。
C语言 printf() 位于 <stdio.h> 头文件中,它的原型为:int printf( const char * format, argument... );
参数说明
format 为格式字符串,由格式说明符和普通字符构成。其中:- 普通字符按照原样输出,比如英文、数字、逗号、空格等;
-
格式说明符以
%
开头,比如 %d、%s、%c 等。
argument 表示将要输出的数据,多份数据以
,
分隔。数据的个数和类型,要与格式说明符一一对应。printf() 会将 argument 格式化,并插入到 format 字符串中,代替对应的格式说明符。
返回值
printf() 函数返回一个 int 类型的整数,表示成功输出的字符个数;如果输出发生错误,则返回一个负数。在C语言中,我们可以利用这个返回值来检查输出是否成功,或者计算输出的字符数。format 中的格式说明符
format 中的格式说明符比较复杂,它的标准写法如下:%[flags][width][.precision][length]specifier
末尾的 specifier 不能省略,其它由[ ]
包围的部分可以省略。
specifier
specifier 是格式字符,它最重要,指明了要输出的数据的类型和形式。specifier | 输出形式 | 示例 |
---|---|---|
d 或者 i | 有符号十进制整数 | 392 |
u | 无符号十进制整数 | 7235 |
o | 无符号八进制数 | 610 |
x | 无符号十六进制整数 | 7fa |
X | 无符号十六进制整数(大写) | 7FA |
f | 十进制浮点数(小写) | 392.65 |
F | 十进制浮点数(大写) | 392.65 |
e | 科学计数法(尾数+指数的形式),小写 | 3.9265e+2 |
E | 科学计数法(尾数+指数的形式),大写 | 3.9265E+2 |
g | 使用 %e 和 %f 中的较短形式输出 | 392.65 |
G | 使用 %E 和 %F 中的较短形式输出 | 392.65 |
a | 十六进制浮点数(小写) | -0xc.90fep-2 |
A | 十六进制浮点数(大写) | -0XC.90FEP-2 |
c | 字符 | a |
s | 字符串 | sample |
p | 指针地址 | b8000000 |
n |
对应的参数为一个指向 int 类型变量的指针。%n 不输出任何内容,而是用于将已经输出的字符个数(不包括 %n 对应的输出)存储到指针所指向的变量中。
printf() 的返回值也表示输出的字符个数,一般情况下两者是相等的。 |
|
% | % 后面再跟一个 %,会输出一个 %,可以看做 % 的转义形式 | % |
flags
flags 控制输出数据的对齐方式。flags | 说明 |
---|---|
- | 在给定的输出宽度内左对齐。如果不指明,默认为右对齐。 |
+ |
用于整数或小数,输出时强制加上正负号,即使对于正数也是如此。如果不指明,默认只有负数才加- 符号。 |
空格 | 用于整数或者小数,输出值为正时冠以空格,为负时冠以负号。 |
# |
对于八进制(%o)和十六进制(%x / %X)整数,# 表示在输出时添加前缀;八进制的前缀是 0,十六进制的前缀是 0x / 0X。 对于小数(%a / %A、%e / %E、%f / %F、%g / %G),# 表示强迫输出小数点。如果没有小数部分,默认是不输出小数点的,加上 # 以后,即使没有小数部分也会带上小数点。 |
0 | 当输出宽度不足时,在数字左侧填充 0,而不是空格。 |
width
width 用来表示输出宽度,也就是最少占用几个字符的位置。width | 说明 |
---|---|
数字 |
width 为一个整数时,表示最小的输出宽度。如果实际输出宽度不足 width,则以 flags 指定的方式来填充;如果 flags 没有指定,则以空格来填充。 当输出结果的宽度超过 width 时,width 不再起作用,按照实际宽度来输出。 |
* | 宽度不在格式字符串 format 中指定,而是在对应的参数(输出数据)前面再增加一个额外的参数,专门用来指定输出宽度。 |
.precision
.precision 表示输出精度。对于不同的格式字符(specifier),精度的含义是不同的。.precision | 说明 |
---|---|
.数字 |
precision 为一个整数时:
|
.* | 精度不在格式字符串 format 中指定,而是在对应的参数(输出数据)前面再增加一个额外的参数,专门用来指定精度。 |
length
length 是 specifier 的子说明符,用来改变数据类型的长度。这意味着,对应的参数在适当的情况下可以进行类型转换,或者类型提升。格式字符(specifier) | |||||||
---|---|---|---|---|---|---|---|
length | %d %i | %u %o %x %X |
%f %F %e %E %g %G %a %A |
%c | %s | %p | %n |
默认(不指明 length) | int | unsigned int | double | int | char* | void* | int* |
hh | signed char | unsigned char | signed char* | ||||
h | short int | unsigned short int | short int* | ||||
l | long int | unsigned long int | wint_t | wchar_t* | long int* | ||
ll | long long int | unsigned long long int | long long int* | ||||
j | intmax_t | uintmax_t | intmax_t* | ||||
z | size_t | size_t | size_t* | ||||
t | ptrdiff_t | ptrdiff_t | ptrdiff_t* | ||||
L | long double |
注意:对于 %c 说明符,虽然它要求的参数(输出数据)类型为 int 或者 wint_t,但是在格式化输出之前,会将其适当地转换为 char 或者 wchar_t 类型。
上面淡黄色背景的行,为 C99 标准引入的说明符或者子说明符。C语言printf()用法举例
为了方便读者理解,这里给出几个有代表性的例子。一个简单的例子
#include <stdio.h> int main() { int age = 25; float height = 1.75; char name[] = "Alice"; printf("Name: %s, Age: %d, Height: %.2f m\n", name, age, height); return 0; }
输出结果:
Name: Alice, Age: 25, Height: 1.75 m
在这个例子中,我们使用了 %s 来输出字符串 name,%d 来输出整数 age,%.2f 来输出保留两位小数的浮点数 height。
width 用法举例
#include <stdio.h> int main() { int n = 234; float f = 9.8f; char c = '@'; char str[] = "C Language is great"; printf("%10d%12f%4c%8s", n, f, c, str); return 0; }输出结果:
234 9.800000 @C Language is great对输出结果的说明:
- n 的指定输出宽度为 10,234 的宽度为 3,所以前边要补上 7 个空格。
- f 的指定输出宽度为 12,9.800000 的宽度为 8,所以前边要补上 4 个空格。
- str 的指定输出宽度为 8,"C Language is great" 的宽度为 19,超过了 8,所以指定输出宽度不再起作用,而是按照 str 的实际宽度输出。
.precision 用法举例
#include <stdio.h> int main(){ int n = 123456; double f = 882.923672; char *str = "abcdefghi"; printf("n: %.9d %.4d\n", n, n); printf("f: %.2lf %.4lf %.10lf\n", f, f, f); printf("str: %.5s %.15s\n", str, str); return 0; }输出结果:
n: 000123456 123456 f: 882.92 882.9237 882.9236720000 str: abcde abcdefghi对输出结果的说明:
- 对于 n,.precision 表示最小输出宽度。n 本身的宽度为 6,当 precision 为 9 时,大于 6,要在 n 的前面补 3 个 0;当 precision 为 4 时,小于 6,不再起作用。
- 对于 f,.precision 表示输出精度。f 的小数部分有 6 位数字,当 precision 为 2 或者 4 时,都小于 6,要按照四舍五入的原则截断小数;当 precision 为 10 时,大于 6,要在小数的后面补四个 0。
- 对于 str,.precision 表示最大输出宽度。str 本身的宽度为 9,当 precision 为 5 时,小于 9,要截取 str 的前 5 个字符;当 precision 为 15 时,大于 9,不再起作用。
flag 用法举例
#include <stdio.h> int main(){ int m = 192, n = -943; float f = 84.342; printf("m=%10d, m=%-10d\n", m, m); //演示 - 的用法 printf("m=%+d, n=%+d\n", m, n); //演示 + 的用法 printf("m=% d, n=% d\n", m, n); //演示空格的用法 printf("f=%.0f, f=%#.0f\n", f, f); //演示#的用法 return 0; }输出结果:
m= 192, m=192 m=+192, n=-943 m= 192, n=-943 f=84, f=84.对输出结果的说明
-
当以
%10d
输出 m 时,是右对齐,所以在 192 前面补七个空格;当以%-10d
输出 m 时,是左对齐,所以在 192 后面补七个空格。 -
m 是正数,以
%+d
输出时要带上正号;n 是负数,以%+d
输出时要带上负号。 -
m 是正数,以
% d
输出时要在前面加空格;n 是负数,以% d
输出时要在前面加负号。 -
%.0f
表示保留 0 位小数,也就是只输出整数部分,不输出小数部分。默认情况下,这种输出形式是不带小数点的,但是如果有了#
标志,那么就要在整数的后面“硬加上”一个小数点,以和纯整数区分开。
综合示例
#include <stdio.h> int main(){ printf("输出字符: %c %c \n", 'a', 65); printf("输出十进制数: %d %ld\n", 1977, 650000L); printf("用空格填充: %10d \n", 1977); printf("用0填充: %010d \n", 1977); printf("输出不同进制: %d %x %o %#x %#o \n", 100, 100, 100, 100, 100); printf("输出小数: %4.2f %+.0e %E \n", 3.1416, 3.1416, 3.1416); printf("指定宽度: %*d \n", 5, 10); printf("输出字符串:%s \n", "C language is great"); return 0; }输出结果:
输出字符: a A 输出十进制数: 1977 650000 用空格填充: 1977 用0填充: 0000001977 输出不同进制: 100 64 144 0x64 0144 输出小数: 3.14 +3e+00 3.141600E+00 指定宽度: 10 输出字符串:C language is great