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

C语言 printf 系列函数完整格式化占位符速查表(依据C89/C99/C11/C17/C23标准)

✅ 严格区分 输出占位符(printf 系列)|⚠️ 非 scanf 输入格式
📌 标注标准版本、数据类型、大小写差异、常见陷阱


🔢 一、整数类型(含长度修饰符组合)

占位符数据类型说明标准示例
%d, %iint有符号十进制(%i 可识别八/十六进制前缀)C89printf("%d", -42); → -42
%uunsigned int无符号十进制C89printf("%u", 4294967295U);
%ounsigned int无符号八进制(无 0 前缀)C89printf("%o", 10); → 12
%#ounsigned int带 0 前缀的八进制C89printf("%#o", 10); → 012
%x, %Xunsigned int十六进制(小写/大写字母)C89printf("%x %X", 255, 255); → ff FF
%#x, %#Xunsigned int带 0x/0X 前缀C89printf("%#x", 255); → 0xff
%hd, %hishort短整型十进制C89printf("%hd", (short)300);
%hu, %ho, %hxunsigned short无符号短整型(十/八/十六进制)C89printf("%hu", 65535);
%ld, %lilong长整型C89printf("%ld", 100000L);
%lu, %lo, %lxunsigned long无符号长整型C89printf("%lx", 0xFFFFFFFFUL);
%lld, %llilong long长长整型C99printf("%lld", 9223372036854775807LL);
%llu, %llo, %llxunsigned long long无符号长长整型C99printf("%llu", 18446744073709551615ULL);
%zdssize_t (POSIX)有符号 size_t(非标准C,慎用)POSIX
%zusize_tsizeof 返回类型(无符号)C99printf("%zu", sizeof(int)); → 4
%tdptrdiff_t指针差值类型(有符号)C99printf("%td", &arr[5]-&arr[0]); → 5
%b, %Bunsigned int二进制输出(小写/大写 0b 前缀)C23printf("%b", 10); → 0b1010(需 -std=c23)

⚠️ 关键修正

  • size_t 标准占位符是 %zu(非 %zd), %zd 描述有误(%zd 用于 ssize_t,属 POSIX 扩展)
  • ptrdiff_t 标准占位符为 %td

🌊 二、浮点数类型

占位符数据类型说明标准
%f, %Ffloat/double十进制小数(%F 用大写 INF/NAN)C89
%e, %Efloat/double科学计数法(e/E 指数标识)C89
%g, %Gfloat/double自动选 %f 或 %e(更短者),去除尾零C89
%a, %Afloat/double十六进制浮点(0x1.92p+3 格式)C99
%Lf, %Le, %Lg, %Lalong double长双精度浮点(注意大写 L)C89/C99

💡 提示:printf 中 float 会自动提升为 double,故 %f 通用于两者;long double 必须用 %Lf 等。


🔤 三、字符与字符串

占位符数据类型说明示例
%cchar单个字符printf("%c", 'A'); → A
%schar*以 \0 结尾的字符串printf("%s", "Hi"); → Hi
%hhdsigned char作为有符号整数输出printf("%hhd", (signed char)-1);
%hhuunsigned char作为无符号整数输出printf("%hhu", (unsigned char)255);

📍 四、指针与特殊占位符

占位符说明示例
%p指针地址(十六进制,实现定义格式,通常带 0x)printf("%p", (void*)&var);
%n不输出,将已输出字符数写入 int* 参数int cnt; printf("Hi%n", &cnt); // cnt=2
%%输出字面 % 符号printf("100%%"); → 100%

🎯 五、修饰符组合规则(核心语法)

完整格式:%[flags][width][.precision][length]specifier

修饰符类型说明示例
Flags- 左对齐, + 强制符号, 空格补正号, 0 前导零, # 备用格式printf("%05d", 7); → 00007
Width最小输出宽度(整数或 * 动态指定)printf("%10s", "Hi"); → Hi
Precision小数位数/字符串最大长度(.数字 或 .*)printf("%.2f", 3.1415); → 3.14
Lengthhh (char), h (short), l (long), ll (long long), z (size_t), t (ptrdiff_t), L (long double)printf("%lld", 1LL);

⚠️ 六、高频陷阱与最佳实践

陷阱错误示例正确做法
数组传参后用 sizeofvoid f(int a[]) { printf("%zu", sizeof(a)); }传入长度参数:f(a, sizeof(a)/sizeof(a[0]))
size_t 误用 %uprintf("%u", sizeof(int));(64位系统截断)必须用 %zu
long long 误用 %ldprintf("%ld", 10000000000LL);用 %lld 或 %llu
指针未转 void*printf("%p", &x);(部分编译器警告)printf("%p", (void*)&x);
%n 安全风险用户可控格式字符串含 %n避免将用户输入直接作格式串

📚 标准演进摘要

  • C89:基础整数/浮点/字符占位符(%d, %f, %s 等)
  • C99:新增 %zu(size_t)、%td(ptrdiff_t)、%a(十六进制浮点)、long long 支持
  • C23:新增 %b/%B(二进制输出,需编译器支持)

权威依据

  • C11 标准 §7.21.6.1:z 修饰符用于 size_t,t 用于 ptrdiff_t
  • %zu 为 sizeof 返回类型标准占位符
  • %zd 描述为常见误区(实际应为 %zu)

此表可作为开发/面试/调试的权威速查 reference,建议收藏! 📌