国际访客建议访问 Primers 编程伙伴 国际版站点 > C 教程 > printf 以获得更好的体验。

# C 语言标准库函数 printf

在头文件 stdio.h 中定义。
/*********************************************
 * @brief 向标准输出中进行输出
 * @param format 格式字符串
 * @param ... 可变长度参数,要打印的变量
 * @return 打印的字符数量
 ********************************************/
int printf(const char* restrict format, ...);

!subtitle:说明

向标准输出中进行输出。

!subtitle:参数

  • format - 格式化字符串,指向以空字符(\0)结尾的字符串指针,指定如何解释数据

    • 普通字符直接打印

    • 转义字符) 按照转义打印

    • % 开头的 格式占位符,按照指定格式打印后续相应位置的参数

  • ... - 可变长度参数,为要打印的变量,需要与 format 参数中的格式占位符一一对应

!subtitle:返回值

  • 成功时返回打印的字符数量

  • 失败时返回负值

# 示例

#include <stdio.h>

int main(void)
{
    int x = 1024;
    float y = 3.1415926;
    char ch = '@';
    char* text = "hello";

    printf("x=%d, y=%f, ch=%c, text=%s\n", x, y, ch, text);

    return 0;
}

运行结果:

x=1024, y=3.141593, ch=@, text=hello

# 转义字符

转义字符用于表示一些无法直接表示的字符,例如 \n 表示换行,以下是转义字符表:

转义字符 名称说明 ASCII 值(十进制) 说明举例
\\ 反斜杠 92 表示 \ 字符本身
\' 单引号 39 表示 ' 字符本身,而非语法的一部分
\" 双引号 34 表示 " 字符本身,而非语法的一部分
\n 换行符(Line Feed) 10 输出换行,UNIX 系统行结束符
\r 回车符(Carriage Return) 13 Windows 系统行结束中的一部分
\t 水平制表符(Tab) 9 插入一个 tab 间隔
\v 垂直制表符 11 少用,控制打印机换行
\b 退格(Backspace) 8 删除上一个字符(视终端而定)
\a 响铃(Alert) 7 终端响铃或提示音
\f 换页符(Form Feed) 12 少用,用于分页打印机
\? 问号(避免 ?? 被解释) 63 预处理器中防止三字母替换
\0 空字符(Null) 0 字符串结尾标志
\nnn 八进制字符 0~255 \141'a'
\xhh 十六进制字符 0~255 \x61'a'

# 格式占位符

格式占位符以 %[标识][最小宽度][.精度][长度修饰]说明符 的形式出现。

  • 最小宽度:打印的最小宽度,内容不足时使用空格或 0 补全

    • 如果使用一个星号(*),则消耗一个 int 型参数作为最小宽度

  • 精度:指定转换的精度

    • 如果使用一个星号(*),则消耗一个 int 型参数作为精度

    • 对于正数数(%d 等),表示最小位数

    • 对于浮点数(%f 等),表示小数点后的位数

    • 对于字符串(%s),表示最大宽度

  • 长度修饰:表示类型长度,例如 %dint,而 %ldlong

标识 说明
- 左对齐(默认是右对齐)
+ 有符号数始终显示符号(默认仅负数显示负号)
(空格) 有符号数非负时开头添加空格
# 使用替代转换,例如 %#x 会打印 0x 前缀
0 前导 0 补全宽度
说明符 !embed:<div style='min-width:12em'>说明</div> 参数类型 hh h l ll j z t L
% 百分号(%)本身
c 单个字符 int wint_t
s 字符串,以空字符(\0)结尾 char* wchar_t*
d 有符号十进制整数 int signed char short long long long intmax_t ptrdiff_t
i 有符号十进制整数,同 %d int signed char short long long long intmax_t ptrdiff_t
u 无符号十进制整数 unsigned int unsigned char unsigned short unsigned long unsigned long long uintmax_t size_t ptrdiff_t
o 无符号八进制整数 unsigned int unsigned char unsigned short unsigned long unsigned long long uintmax_t size_t unsigned ptrdiff_t
x 无符号十六进制整数,字母小写 unsigned int unsigned char unsigned short unsigned long unsigned long long uintmax_t size_t unsigned ptrdiff_t
X 无符号十六进制整数,字母大写 unsigned int unsigned char unsigned short unsigned long unsigned long long uintmax_t size_t unsigned ptrdiff_t
f 浮点数,字母小写 double double long double
F 浮点数,同 %f double double long double
e 浮点数,科学计数法,字母小写 double double long double
E 浮点数,科学计数法,字母大写 double double long double
g 浮点数,省略小数末尾的 0,值较大时使用科学计数法,字母小写 double double long double
G 浮点数,省略小数末尾的 0,值较大时使用科学计数法,字母大写 double double long double
a 浮点数,十六进制,科学计数法,字母小写 double double long double
A 浮点数,十六进制,科学计数法,字母大写 double double long double
p 指针地址 void*
n 将当前已打印的字符数量写入参数中 int* siged char* short* long* long long* intmax_t* ptrdiff_t*

# 特殊格式宏

由于 C 语言中类型的长度不是固定的。反过来说,固定长度的类型,其原始类型是不确定的。

例如 int32_t 在某些环境下是 int,另外某些环境下是 long;前者使用 printf 打印时应使用 %d,而后者应使用 %ld

为了方便,可以使用以下宏来标识格式。

printf 格式 标准 说明
PRId8 C99 printf 中用于打印 int8_td 格式(有符号十进制)
PRId16 C99 printf 中用于打印 int16_td 格式
PRId32 C99 printf 中用于打印 int32_td 格式
PRId64 C99 printf 中用于打印 int64_td 格式
PRIdPTR C99 printf 中用于打印 intptr_td 格式
PRIdMAX C99 printf 中用于打印 intmax_td 格式
PRIdFAST8 C99 printf 中用于打印 int_fast8_td 格式
PRIdFAST16 C99 printf 中用于打印 int_fast16_td 格式
PRIdFAST32 C99 printf 中用于打印 int_fast32_td 格式
PRIdFAST64 C99 printf 中用于打印 int_fast64_td 格式
PRIdLEAST8 C99 printf 中用于打印 int_least8_td 格式
PRIdLEAST16 C99 printf 中用于打印 int_least16_td 格式
PRIdLEAST32 C99 printf 中用于打印 int_least32_td 格式
PRIdLEAST64 C99 printf 中用于打印 int_least64_td 格式
PRIi8 C99 printf 中用于打印 int8_ti 格式(有符号十进制)
PRIi16 C99 printf 中用于打印 int16_ti 格式
PRIi32 C99 printf 中用于打印 int32_ti 格式
PRIi64 C99 printf 中用于打印 int64_ti 格式
PRIiPTR C99 printf 中用于打印 intptr_ti 格式
PRIiMAX C99 printf 中用于打印 intmax_ti 格式
PRIiFAST8 C99 printf 中用于打印 int_fast8_ti 格式
PRIiFAST16 C99 printf 中用于打印 int_fast16_ti 格式
PRIiFAST32 C99 printf 中用于打印 int_fast32_ti 格式
PRIiFAST64 C99 printf 中用于打印 int_fast64_ti 格式
PRIiLEAST8 C99 printf 中用于打印 int_least8_ti 格式
PRIiLEAST16 C99 printf 中用于打印 int_least16_ti 格式
PRIiLEAST32 C99 printf 中用于打印 int_least32_ti 格式
PRIiLEAST64 C99 printf 中用于打印 int_least64_ti 格式
PRIu8 C99 printf 中用于打印 uint8_tu 格式(无符号十进制)
PRIu16 C99 printf 中用于打印 uint16_tu 格式
PRIu32 C99 printf 中用于打印 uint32_tu 格式
PRIu64 C99 printf 中用于打印 uint64_tu 格式
PRIuPTR C99 printf 中用于打印 uintptr_tu 格式
PRIuMAX C99 printf 中用于打印 uintmax_tu 格式
PRIuFAST8 C99 printf 中用于打印 uint_fast8_tu 格式
PRIuFAST16 C99 printf 中用于打印 uint_fast16_tu 格式
PRIuFAST32 C99 printf 中用于打印 uint_fast32_tu 格式
PRIuFAST64 C99 printf 中用于打印 uint_fast64_tu 格式
PRIuLEAST8 C99 printf 中用于打印 uint_least8_tu 格式
PRIuLEAST16 C99 printf 中用于打印 uint_least16_tu 格式
PRIuLEAST32 C99 printf 中用于打印 uint_least32_tu 格式
PRIuLEAST64 C99 printf 中用于打印 uint_least64_tu 格式
PRIo8 C99 printf 中用于打印 uint8_to 格式(有符号八进制)
PRIo16 C99 printf 中用于打印 uint16_to 格式
PRIo32 C99 printf 中用于打印 uint32_to 格式
PRIo64 C99 printf 中用于打印 uint64_to 格式
PRIoPTR C99 printf 中用于打印 uintptr_to 格式
PRIoMAX C99 printf 中用于打印 uintmax_to 格式
PRIoFAST8 C99 printf 中用于打印 uint_fast8_to 格式
PRIoFAST16 C99 printf 中用于打印 uint_fast16_to 格式
PRIoFAST32 C99 printf 中用于打印 uint_fast32_to 格式
PRIoFAST64 C99 printf 中用于打印 uint_fast64_to 格式
PRIoLEAST8 C99 printf 中用于打印 uint_least8_to 格式
PRIoLEAST16 C99 printf 中用于打印 uint_least16_to 格式
PRIoLEAST32 C99 printf 中用于打印 uint_least32_to 格式
PRIoLEAST64 C99 printf 中用于打印 uint_least64_to 格式
PRIx8 C99 printf 中用于打印 uint8_tx 格式(有符号十六进制,小写)
PRIx16 C99 printf 中用于打印 uint16_tx 格式
PRIx32 C99 printf 中用于打印 uint32_tx 格式
PRIx64 C99 printf 中用于打印 uint64_tx 格式
PRIxPTR C99 printf 中用于打印 uintptr_tx 格式
PRIxMAX C99 printf 中用于打印 uintmax_tx 格式
PRIxFAST8 C99 printf 中用于打印 uint_fast8_tx 格式
PRIxFAST16 C99 printf 中用于打印 uint_fast16_tx 格式
PRIxFAST32 C99 printf 中用于打印 uint_fast32_tx 格式
PRIxFAST64 C99 printf 中用于打印 uint_fast64_tx 格式
PRIxLEAST8 C99 printf 中用于打印 uint_least8_tx 格式
PRIxLEAST16 C99 printf 中用于打印 uint_least16_tx 格式
PRIxLEAST32 C99 printf 中用于打印 uint_least32_tx 格式
PRIxLEAST64 C99 printf 中用于打印 uint_least64_tx 格式
PRIX8 C99 printf 中用于打印 uint8_tX 格式(有符号十六进制,大写)
PRIX16 C99 printf 中用于打印 uint16_tX 格式
PRIX32 C99 printf 中用于打印 uint32_tX 格式
PRIX64 C99 printf 中用于打印 uint64_tX 格式
PRIXPTR C99 printf 中用于打印 uintptr_tX 格式
PRIXMAX C99 printf 中用于打印 uintmaX_tX 格式
PRIXFAST8 C99 printf 中用于打印 uint_fast8_tX 格式
PRIXFAST16 C99 printf 中用于打印 uint_fast16_tX 格式
PRIXFAST32 C99 printf 中用于打印 uint_fast32_tX 格式
PRIXFAST64 C99 printf 中用于打印 uint_fast64_tX 格式
PRIXLEAST8 C99 printf 中用于打印 uint_least8_tX 格式
PRIXLEAST16 C99 printf 中用于打印 uint_least16_tX 格式
PRIXLEAST32 C99 printf 中用于打印 uint_least32_tX 格式
PRIXLEAST64 C99 printf 中用于打印 uint_least64_tX 格式

# 推荐阅读

# 参考标准

  • C23 standard (ISO/IEC 9899:2024):

    • 7.21.6.3 The printf function (p: TBD)

  • C17 standard (ISO/IEC 9899:2018):

    • 7.21.6.3 The printf function (p: 236)

  • C11 standard (ISO/IEC 9899:2011):

    • 7.21.6.3 The printf function (p: 324)

  • C99 standard (ISO/IEC 9899:1999):

    • 7.19.6.3 The printf function (p: 290)

  • C89/C90 standard (ISO/IEC 9899:1990):

    • 4.9.6.3 The printf function

本文 更新于: 2025-11-27 09:38:09 创建于: 2025-11-27 09:38:09