/*********************************************
* @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),表示最大宽度
长度修饰:表示类型长度,例如 %d 是 int,而 %ld 是 long
| 标识 | 说明 |
|---|---|
- |
左对齐(默认是右对齐) |
+ |
有符号数始终显示符号(默认仅负数显示负号) |
(空格) |
有符号数非负时开头添加空格 |
# |
使用替代转换,例如 %#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_t 的 d 格式(有符号十进制) |
PRId16 |
C99 | printf 中用于打印 int16_t 的 d 格式 |
PRId32 |
C99 | printf 中用于打印 int32_t 的 d 格式 |
PRId64 |
C99 | printf 中用于打印 int64_t 的 d 格式 |
PRIdPTR |
C99 | printf 中用于打印 intptr_t 的 d 格式 |
PRIdMAX |
C99 | printf 中用于打印 intmax_t 的 d 格式 |
PRIdFAST8 |
C99 | printf 中用于打印 int_fast8_t 的 d 格式 |
PRIdFAST16 |
C99 | printf 中用于打印 int_fast16_t 的 d 格式 |
PRIdFAST32 |
C99 | printf 中用于打印 int_fast32_t 的 d 格式 |
PRIdFAST64 |
C99 | printf 中用于打印 int_fast64_t 的 d 格式 |
PRIdLEAST8 |
C99 | printf 中用于打印 int_least8_t 的 d 格式 |
PRIdLEAST16 |
C99 | printf 中用于打印 int_least16_t 的 d 格式 |
PRIdLEAST32 |
C99 | printf 中用于打印 int_least32_t 的 d 格式 |
PRIdLEAST64 |
C99 | printf 中用于打印 int_least64_t 的 d 格式 |
PRIi8 |
C99 | printf 中用于打印 int8_t 的 i 格式(有符号十进制) |
PRIi16 |
C99 | printf 中用于打印 int16_t 的 i 格式 |
PRIi32 |
C99 | printf 中用于打印 int32_t 的 i 格式 |
PRIi64 |
C99 | printf 中用于打印 int64_t 的 i 格式 |
PRIiPTR |
C99 | printf 中用于打印 intptr_t 的 i 格式 |
PRIiMAX |
C99 | printf 中用于打印 intmax_t 的 i 格式 |
PRIiFAST8 |
C99 | printf 中用于打印 int_fast8_t 的 i 格式 |
PRIiFAST16 |
C99 | printf 中用于打印 int_fast16_t 的 i 格式 |
PRIiFAST32 |
C99 | printf 中用于打印 int_fast32_t 的 i 格式 |
PRIiFAST64 |
C99 | printf 中用于打印 int_fast64_t 的 i 格式 |
PRIiLEAST8 |
C99 | printf 中用于打印 int_least8_t 的 i 格式 |
PRIiLEAST16 |
C99 | printf 中用于打印 int_least16_t 的 i 格式 |
PRIiLEAST32 |
C99 | printf 中用于打印 int_least32_t 的 i 格式 |
PRIiLEAST64 |
C99 | printf 中用于打印 int_least64_t 的 i 格式 |
PRIu8 |
C99 | printf 中用于打印 uint8_t 的 u 格式(无符号十进制) |
PRIu16 |
C99 | printf 中用于打印 uint16_t 的 u 格式 |
PRIu32 |
C99 | printf 中用于打印 uint32_t 的 u 格式 |
PRIu64 |
C99 | printf 中用于打印 uint64_t 的 u 格式 |
PRIuPTR |
C99 | printf 中用于打印 uintptr_t 的 u 格式 |
PRIuMAX |
C99 | printf 中用于打印 uintmax_t 的 u 格式 |
PRIuFAST8 |
C99 | printf 中用于打印 uint_fast8_t 的 u 格式 |
PRIuFAST16 |
C99 | printf 中用于打印 uint_fast16_t 的 u 格式 |
PRIuFAST32 |
C99 | printf 中用于打印 uint_fast32_t 的 u 格式 |
PRIuFAST64 |
C99 | printf 中用于打印 uint_fast64_t 的 u 格式 |
PRIuLEAST8 |
C99 | printf 中用于打印 uint_least8_t 的 u 格式 |
PRIuLEAST16 |
C99 | printf 中用于打印 uint_least16_t 的 u 格式 |
PRIuLEAST32 |
C99 | printf 中用于打印 uint_least32_t 的 u 格式 |
PRIuLEAST64 |
C99 | printf 中用于打印 uint_least64_t 的 u 格式 |
PRIo8 |
C99 | printf 中用于打印 uint8_t 的 o 格式(有符号八进制) |
PRIo16 |
C99 | printf 中用于打印 uint16_t 的 o 格式 |
PRIo32 |
C99 | printf 中用于打印 uint32_t 的 o 格式 |
PRIo64 |
C99 | printf 中用于打印 uint64_t 的 o 格式 |
PRIoPTR |
C99 | printf 中用于打印 uintptr_t 的 o 格式 |
PRIoMAX |
C99 | printf 中用于打印 uintmax_t 的 o 格式 |
PRIoFAST8 |
C99 | printf 中用于打印 uint_fast8_t 的 o 格式 |
PRIoFAST16 |
C99 | printf 中用于打印 uint_fast16_t 的 o 格式 |
PRIoFAST32 |
C99 | printf 中用于打印 uint_fast32_t 的 o 格式 |
PRIoFAST64 |
C99 | printf 中用于打印 uint_fast64_t 的 o 格式 |
PRIoLEAST8 |
C99 | printf 中用于打印 uint_least8_t 的 o 格式 |
PRIoLEAST16 |
C99 | printf 中用于打印 uint_least16_t 的 o 格式 |
PRIoLEAST32 |
C99 | printf 中用于打印 uint_least32_t 的 o 格式 |
PRIoLEAST64 |
C99 | printf 中用于打印 uint_least64_t 的 o 格式 |
PRIx8 |
C99 | printf 中用于打印 uint8_t 的 x 格式(有符号十六进制,小写) |
PRIx16 |
C99 | printf 中用于打印 uint16_t 的 x 格式 |
PRIx32 |
C99 | printf 中用于打印 uint32_t 的 x 格式 |
PRIx64 |
C99 | printf 中用于打印 uint64_t 的 x 格式 |
PRIxPTR |
C99 | printf 中用于打印 uintptr_t 的 x 格式 |
PRIxMAX |
C99 | printf 中用于打印 uintmax_t 的 x 格式 |
PRIxFAST8 |
C99 | printf 中用于打印 uint_fast8_t 的 x 格式 |
PRIxFAST16 |
C99 | printf 中用于打印 uint_fast16_t 的 x 格式 |
PRIxFAST32 |
C99 | printf 中用于打印 uint_fast32_t 的 x 格式 |
PRIxFAST64 |
C99 | printf 中用于打印 uint_fast64_t 的 x 格式 |
PRIxLEAST8 |
C99 | printf 中用于打印 uint_least8_t 的 x 格式 |
PRIxLEAST16 |
C99 | printf 中用于打印 uint_least16_t 的 x 格式 |
PRIxLEAST32 |
C99 | printf 中用于打印 uint_least32_t 的 x 格式 |
PRIxLEAST64 |
C99 | printf 中用于打印 uint_least64_t 的 x 格式 |
PRIX8 |
C99 | printf 中用于打印 uint8_t 的 X 格式(有符号十六进制,大写) |
PRIX16 |
C99 | printf 中用于打印 uint16_t 的 X 格式 |
PRIX32 |
C99 | printf 中用于打印 uint32_t 的 X 格式 |
PRIX64 |
C99 | printf 中用于打印 uint64_t 的 X 格式 |
PRIXPTR |
C99 | printf 中用于打印 uintptr_t 的 X 格式 |
PRIXMAX |
C99 | printf 中用于打印 uintmaX_t 的 X 格式 |
PRIXFAST8 |
C99 | printf 中用于打印 uint_fast8_t 的 X 格式 |
PRIXFAST16 |
C99 | printf 中用于打印 uint_fast16_t 的 X 格式 |
PRIXFAST32 |
C99 | printf 中用于打印 uint_fast32_t 的 X 格式 |
PRIXFAST64 |
C99 | printf 中用于打印 uint_fast64_t 的 X 格式 |
PRIXLEAST8 |
C99 | printf 中用于打印 uint_least8_t 的 X 格式 |
PRIXLEAST16 |
C99 | printf 中用于打印 uint_least16_t 的 X 格式 |
PRIXLEAST32 |
C99 | printf 中用于打印 uint_least32_t 的 X 格式 |
PRIXLEAST64 |
C99 | printf 中用于打印 uint_least64_t 的 X 格式 |
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