#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
#格式占位符
格式占位符以 %[标识][宽度][.精度][长度修饰]说明符
的形式出现。
- 宽度:打印的宽度,内容不足时使用空格或 0 补全
- 精度:小数点后显示的位数
- 长度修饰:表示类型长度,例如
%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_least816_t 的 d 格式 |
PRIdLEAST32 | C99 | printf 中用于打印 int_least832_t 的 d 格式 |
PRIdLEAST64 | C99 | printf 中用于打印 int_least864_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_least816_t 的 i 格式 |
PRIiLEAST32 | C99 | printf 中用于打印 int_least832_t 的 i 格式 |
PRIiLEAST64 | C99 | printf 中用于打印 int_least864_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_least816_t 的 u 格式 |
PRIuLEAST32 | C99 | printf 中用于打印 uint_least832_t 的 u 格式 |
PRIuLEAST64 | C99 | printf 中用于打印 uint_least864_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_least816_t 的 o 格式 |
PRIoLEAST32 | C99 | printf 中用于打印 uint_least832_t 的 o 格式 |
PRIoLEAST64 | C99 | printf 中用于打印 uint_least864_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_least816_t 的 x 格式 |
PRIxLEAST32 | C99 | printf 中用于打印 uint_least832_t 的 x 格式 |
PRIxLEAST64 | C99 | printf 中用于打印 uint_least864_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_least816_t 的 X 格式 |
PRIXLEAST32 | C99 | printf 中用于打印 uint_least832_t 的 X 格式 |
PRIXLEAST64 | C99 | printf 中用于打印 uint_least864_t 的 X 格式 |