首页 > C语言标准库 > stdio.h

C语言printf()用法大全(非常详细)

printf 是 print format 的缩写,意思是格式化打印,也就是向控制台上格式化输出数据。

严格来说,printf() 是向标准输出文件中输出数据,而这个标准输出文件通常来说都是“黑底白字”的控制台,或者说是显示器。

C语言 printf() 位于 <stdio.h> 头文件中,它的原型为:

int printf( const char * format, argument...  );

参数说明

format 为格式字符串,由格式说明符和普通字符构成。其中:
argument 表示将要输出的数据,多份数据以,分隔。数据的个数和类型,要与格式说明符一一对应。

printf() 会将 argument 格式化,并插入到 format 字符串中,代替对应的格式说明符。

返回值

printf() 函数返回一个 int 类型的整数,表示成功输出的字符个数;如果输出发生错误,则返回一个负数。在C语言中,我们可以利用这个返回值来检查输出是否成功,或者计算输出的字符数。

format 中的格式说明符

format 中的格式说明符比较复杂,它的标准写法如下:

%[flags][width][.precision][length]specifier

末尾的 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 的用法及说明
flags 说明
- 在给定的输出宽度内左对齐。如果不指明,默认为右对齐。
+ 用于整数或小数,输出时强制加上正负号,即使对于正数也是如此。如果不指明,默认只有负数才加-符号。
空格 用于整数或者小数,输出值为正时冠以空格,为负时冠以负号。
# 对于八进制(%o)和十六进制(%x / %X)整数,# 表示在输出时添加前缀;八进制的前缀是 0,十六进制的前缀是 0x / 0X。

对于小数(%a / %A、%e / %E、%f / %F、%g / %G),# 表示强迫输出小数点。如果没有小数部分,默认是不输出小数点的,加上 # 以后,即使没有小数部分也会带上小数点。
0 当输出宽度不足时,在数字左侧填充 0,而不是空格。

width

width 用来表示输出宽度,也就是最少占用几个字符的位置。
width 的用法及说明
width 说明
数字 width 为一个整数时,表示最小的输出宽度。如果实际输出宽度不足 width,则以 flags 指定的方式来填充;如果 flags 没有指定,则以空格来填充。

当输出结果的宽度超过 width 时,width 不再起作用,按照实际宽度来输出。
* 宽度不在格式字符串 format 中指定,而是在对应的参数(输出数据)前面再增加一个额外的参数,专门用来指定输出宽度。

.precision

.precision 表示输出精度。对于不同的格式字符(specifier),精度的含义是不同的。

.precision 的用法及说明
.precision 说明
.数字 precision 为一个整数时:
  • 对于 %d、%i、%o、%u、%x、%X 说明符(整数),precision 表示最小输出宽度;实际宽度不足时用 0 填充,实际宽度超过 precision 时不起作用,以实际宽度输出。和 width 不同的是,输出宽度不足时 precision 会在左边补 0,而不是空格。

    precision 为 0 是一个特殊情况,如果对应的参数(输出数据)是 0,则不输出任何字符,如果对应的参数不为 0,则按实际值输出。

  • 对于 %a、%A、%e、%E、%f、%F 说明符(浮点数),precision 表示小数的位数,也就是小数点后面的数字个数(默认情况下为 6):
    • 当小数部分的位数大于 precision 时,会按照四舍五入的原则丢掉多余的数字;
    • 当小数部分的位数小于 precision 时,会在后面补 0。
  • 对于 %g 和 %G 说明符,precision 表示要输出的最大有效数字的个数。
  • 对于 %s,precision 表示要打印的最大字符个数,超出 precision 部分会被截断。默认情况下,将打印所有字符,直到遇到结束标志\0。如果只有.没有precision,那么假定 precision 为 0,也就是不输出任何字符。
.* 精度不在格式字符串 format 中指定,而是在对应的参数(输出数据)前面再增加一个额外的参数,专门用来指定精度。

length

length 是 specifier 的子说明符,用来改变数据类型的长度。这意味着,对应的参数在适当的情况下可以进行类型转换,或者类型提升。

length 的用法及说明
  格式字符(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
对输出结果的说明:

.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
对输出结果的说明:

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.
对输出结果的说明

综合示例

#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

相关文章