一文说清printf占位符

#基本类型格式占位符表

占位符 类型/用途 示例 说明
%d 有符号十进制整数(int) 42 显示十进制整数
%i %d 42 %d 相同
%u 无符号十进制整数(unsigned int) 42
%x 无符号十六进制(小写 a~f) 2a
%X 无符号十六进制(大写 A~F) 2A
%o 无符号八进制 52
%f 浮点数(float, double) 3.141593 默认保留6位小数
%e 科学计数法(小写 e) 3.141593e+00
%E 科学计数法(大写 E) 3.141593E+00
%g 自动使用 %f%e,较短者优先 3.14 自动切换
%G 自动使用 %f%E 3.14
%c 字符 A 打印单个字符
%s 字符串 "hello" 指针指向以 \0 结尾的字符串
%p 指针地址(void*) 0x7ffee12f3 一般以十六进制打印指针
%% 打印百分号 % 转义 % 本身
%n 写入到参数对应变量的写入字符数 无输出 ⚠️ 很少用,且容易出错

#修饰符(用于配合基本格式)

修饰符 用途描述 示例格式 说明
# 显示前缀(如 0x, 0, 0X %#x 输出:0x2a
0 用 0 填充字段宽度 %04d 输出:0042
- 左对齐 %-4d 输出:42
+ 总是显示符号 %+d 输出:+42
空格 正数前加空格 % d 输出: 42
数字 指定最小宽度 %6d 输出: 42
.数字 指定小数位数(用于浮点数)或最大字符串长度 %.2f 输出:3.14
l 长整型修饰符(long) %ld 通常 64 位整型
ll 长长整型(long long) %lld 128 位整型或超大数
h 短整型修饰符(short)h = half %hd 16位整型short
hh 短短整型修饰符(signed char)hh = half-half %hhd 8位整型signed char
z size_t 对应格式修饰符 %zu 用于 sizeof() 返回值

#示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>

int main() {
    int d = 42;
    unsigned int u = 3000000000U;
    float f = 3.14159f;
    double e = 12345.6789;
    char c = 'A';
    char *s = "Hello, World!";
    void *ptr = s;
    size_t sz = sizeof(double);

    printf("%%d: %d\n", d);                // 有符号整数
    printf("%%i: %i\n", d);                // 同上
    printf("%%u: %u\n", u);                // 无符号整数
    printf("%%x: %x\n", d);                // 十六进制(小写)
    printf("%%#x: %#x\n", d);              // 十六进制带 0x
    printf("%%X: %X\n", d);                // 十六进制(大写)
    printf("%%o: %o\n", d);                // 八进制
    printf("%%#o: %#o\n", d);              // 八进制带前缀
    printf("----------------------------------------\n");
    printf("%%f: %f\n", f);                // 浮点数
    printf("%%.2f: %.2f\n", f);            // 保留2位小数
    printf("%%e: %e\n", e);                // 科学计数法(小写)
    printf("%%E: %E\n", e);                // 科学计数法(大写)
    printf("%%g: %g\n", e);                // 自动选择 %f/%e
    printf("%%G: %G\n", e);                // 自动选择 %f/%E
    printf("----------------------------------------\n");
    printf("%%c: %c\n", c);                // 字符
    printf("%%s: %s\n", s);                // 字符串
    printf("%%p: %p\n", ptr);              // 指针地址
    printf("%%zu: %zu\n", sz);             // size_t 类型(比如 sizeof)
    printf("----------------------------------------\n");
    printf("%%+d: %+d\n", d);              // 显示正负号
    printf("%% d: % d\n", d);              // 正数前加空格
    printf("%%05d: %05d\n", d);            // 宽度5,左补0
    printf("%%-5d: %-5d|\n", d);           // 宽度5,左对齐
    printf("%%%%: %%\n");                  // 输出 %

    return 0;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
输出结果:
%d: 42
%i: 42
%u: 3000000000
%x: 2a
%#x: 0x2a
%X: 2A
%o: 52
%#o: 052
----------------------------------------
%f: 3.141590
%.2f: 3.14
%e: 1.234568e+04
%E: 1.234568E+04
%g: 12345.7
%G: 12345.7
----------------------------------------
%c: A
%s: Hello, World!
%p: 00007FF7A1115050
%zu: 8
----------------------------------------
%+d: +42
% d:  42
%05d: 00042
%-5d: 42   |
%%: %
updatedupdated2025-07-222025-07-22