#C 语言标准库函数 printf
/*********************************************
* @brief 向标准输出中进行输出
* @param format 格式字符串
* @param ... 可变长度参数,要打印的变量
* @return 打印的字符数量
********************************************/
int printf(const char* restrict format, ...);
说明
向标准输出中进行输出。
参数
format- 格式化字符串,指向以空字符(\0)结尾的字符串指针,指定如何解释数据...- 可变长度参数,为要打印的变量,需要与format参数中的格式占位符一一对应
返回值
- 成功时返回打印的字符数量
- 失败时返回负值
#示例
#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 补全宽度 |
| 说明符 | 说明 | 参数类型 | 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