本文最后更新于 2026-01-30,文章内容可能已经过时。

C语言printf系列函数的格式化占位符是一套以%开头的结构化指令系统,核心由类型说明符(如d/i整数、f/e/g/a浮点、c/s字符/串、p指针、x/o进制等)构成,并可灵活组合长度修饰符(h/l/ll/L/z/t/j)、格式标志(-/+/#/0/空格)、宽度与精度参数,形成%[标志][宽度][.精度][长度]类型的标准语法,实现对输出内容的精准控制(包括进制、对齐、填充、小数位、截断等),同时包含%%(输出%)和%n(记录已输出字符数)等特殊功能,全面覆盖所有基本数据类型及复杂格式化场景。

一、基本类型占位符

整数类型

占位符说明示例
%d / %i有符号十进制整数printf("%d", -42); → -42
%u无符号十进制整数printf("%u", 42); → 42
%o无符号八进制整数printf("%o", 10); → 12
%x无符号十六进制整数(小写)printf("%x", 255); → ff
%X无符号十六进制整数(大写)printf("%X", 255); → FF

浮点数类型

占位符说明示例
%f / %F十进制浮点数printf("%f", 3.14); → 3.140000
%e / %E科学计数法(小写/大写e)printf("%e", 3.14); → 3.140000e+00
%g / %G自动选择%f或%e格式printf("%g", 3.14); → 3.14
%a / %A十六进制浮点数(C99)printf("%a", 3.14); → 0x1.91eb851eb851fp+1

字符和字符串类型

占位符说明示例
%c单个字符printf("%c", 'A'); → A
%s字符串printf("%s", "Hello"); → Hello

指针和其他类型

占位符说明示例
%p指针地址(十六进制)printf("%p", &var); → 0x7ffee4b3a9ac
%n存储已输出的字符数printf("Hello%n", &count); → count=5
%%输出百分号本身printf("%%"); → %

二、长度修饰符(与基本类型组合使用)

修饰符说明组合示例说明
hshort%hd, %hushort int, unsigned short
hhchar%hhd, %hhuchar, unsigned char
llong%ld, %lu, %lxlong int, unsigned long
lllong long%lld, %llulong long int, unsigned long long
Llong double%Lf, %Lelong double
zsize_t%zd, %zusize_t类型
tptrdiff_t%tdptrdiff_t类型
jintmax_t%jdintmax_t/uintmax_t类型

三、格式控制标志

标志说明示例输出
-左对齐printf("%-10d", 42);42
+显示正负号printf("%+d", 42);+42
空格正数前加空格printf("% d", 42);42
#替代形式printf("%#x", 255);0xff
0用0填充printf("%05d", 42);00042

四、宽度和精度控制

宽度控制

  • 指定最小字段宽度:%5d(至少占5个字符宽度)
  • 左对齐:%-10s
  • 0填充:%08d

精度控制

  • 浮点数小数位数:%.2f(保留2位小数)
  • 字符串最大长度:%.5s(最多输出5个字符)
  • 同时指定宽度和精度:%8.2f

五、完整格式说明符结构

%[标志][宽度][.精度][长度修饰符]类型

示例:

printf("%-10.2f", 3.14159);  // 左对齐,总宽10,保留2位小数 → "3.14      "
printf("%08x", 255);         // 8位宽,0填充,十六进制 → "000000ff"
printf("%+5d", 42);          // 5位宽,显示正号 → "  +42"
printf("%#o", 10);           // 八进制,带前缀 → "012"