格式化输出函数
printf
int printf(const char *restrict format, ...);
作用
printf
函数根据指定的格式将输出写入标准输出流 stdout
。它是格式化输出的基础函数,广泛用于将数据以人类可读的形式打印到终端。
参数
const char *restrict format
:格式字符串,包含普通字符和转换说明符。普通字符原样输出,转换说明符用于格式化后续参数。...
:可变参数列表,与格式字符串中的转换说明符一一对应。
返回值
- 成功时返回实际输出的字符数(不包括字符串结束符
\0
)。 - 出错时返回负值。
fprintf
int fprintf(FILE *restrict stream, const char *restrict format, ...);
作用
fprintf
函数将格式化的输出写入指定的文件流 stream
,而不是标准输出。它与 printf
的功能类似,只是输出目标不同。
参数
FILE *restrict stream
:指向输出流的指针,例如stdout
、stderr
或通过fopen
打开的文件流。const char *restrict format
:格式字符串,用于指定输出格式。...
:可变参数列表,与格式字符串中的转换说明符一一对应。
返回值
- 成功时返回实际写入的字符数。
- 出错时返回负值。
dprintf
int dprintf(int fd, const char *restrict format, ...);
作用
dprintf
函数将格式化的输出写入指定的文件描述符 fd
,而不是标准输出或文件流。它与 fprintf
类似,但使用文件描述符而非 FILE
指针。
参数
int fd
:文件描述符,指定输出的目标。const char *restrict format
:格式字符串,用于指定输出格式。...
:可变参数列表,与格式字符串中的转换说明符一一对应。
返回值
- 成功时返回实际写入的字符数。
- 出错时返回负值。
sprintf
int sprintf(char *restrict str, const char *restrict format, ...);
作用
sprintf
函数将格式化的输出写入字符数组 str
,而不是标准输出或文件流。它不检查目标数组的大小,容易导致缓冲区溢出。
参数
char *restrict str
:指向目标字符数组的指针,用于存储格式化后的字符串。const char *restrict format
:格式字符串,用于指定输出格式。...
:可变参数列表,与格式字符串中的转换说明符一一对应。
返回值
- 成功时返回写入的字符数(不包括
\0
)。 - 出错时返回负值。
snprintf
int snprintf(char str[restrict .size], size_t size, const char *restrict format, ...);
作用
snprintf
是 sprintf
的安全版本,它最多写入 size - 1
个字符到 str
中,并始终以 \0
结尾,防止缓冲区溢出。
参数
char str[restrict .size]
:指向目标字符数组的指针,用于存储格式化后的字符串。size_t size
:目标数组的大小,防止写入超出边界。const char *restrict format
:格式字符串,用于指定输出格式。...
:可变参数列表,与格式字符串中的转换说明符一一对应。
返回值
- 成功时返回应写入的字符数(不包括
\0
),如果返回值大于等于size
,表示输出被截断。 - 出错时返回负值。
函数变体
int vprintf(const char *restrict format, va_list ap);int vfprintf(FILE *restrict stream, const char *restrict format, va_list ap);int vdprintf(int fd, const char *restrict format, va_list ap);int vsprintf(char *restrict str, const char *restrict format, va_list ap);int vsnprintf(char str[restrict .size], size_t size, const char *restrict format, va_list ap);
这些变体函数接受 va_list
类型的参数列表。
格式化输入函数
scanf
int scanf(const char *restrict format, ...);
作用
scanf
用于从标准输入流 stdin
读取格式化输入。它是 sscanf(3)
的流输入版本,功能是从文件流中读取数据并根据指定的格式进行转换。
参数
const char *restrict format
:格式控制字符串,用于指定输入数据的格式。...
:可变参数列表,用于接收输入数据的变量地址。
返回值
- 成功时返回成功匹配并赋值的输入项数量。
- 如果在第一次成功转换或匹配失败之前到达输入末尾,则返回
EOF
。 - 如果发生读取错误,也会返回
EOF
,并设置流的错误指示器(参见ferror(3)
),同时设置errno
表示错误类型。
sscanf
int sscanf(const char *restrict str, const char *restrict format, ...);
作用
sscanf
函数用于从字符串中按照指定格式读取数据,并将结果存储到相应的变量中。它是标准输入格式化函数 scanf
的变体,专门用于处理字符串输入。函数根据格式字符串中的转换说明符,从输入字符串中提取数据,并将其存储到对应的指针参数所指向的变量中。
参数
const char *restrict str
:指向要从中读取数据的字符串。const char *restrict format
:格式字符串,描述如何解析输入字符串。格式字符串可以包含普通字符、空白字符和转换说明符。...
:可变参数列表,每个参数对应格式字符串中的一个转换说明符,用于存储解析出的数据。每个参数必须是指针类型,且与相应的转换说明符匹配。
返回值
- 成功时返回成功匹配并赋值的输入项数量。这个数量可以少于提供的参数数量,甚至可以是零,如果在早期匹配失败时。
- 如果在第一次成功转换或匹配失败之前到达输入末尾,则返回
EOF
。
fscanf
int fscanf(FILE *restrict stream, const char *restrict format, ...);
作用
fscanf
用于从指定的文件流 stream
中读取格式化输入。
参数
FILE *restrict stream
:要读取的文件流指针。const char *restrict format
:格式控制字符串。...
:可变参数列表,用于接收输入数据的变量地址。
返回值
- 成功时返回成功匹配并赋值的输入项数量。
- 如果在第一次成功转换或匹配失败之前到达输入末尾,则返回
EOF
。 - 如果发生读取错误,也会返回
EOF
,并设置流的错误指示器(参见ferror(3)
),同时设置errno
表示错误类型。
函数变体
int vsscanf(const char *restrict str, const char *restrict format, va_list ap);int vfscanf(FILE *restrict stream, const char *restrict format, va_list ap);int vscanf(const char *restrict format, va_list ap);
这些变体函数接受 va_list
类型的参数列表。
匹配格式
%[flags][fldwidth][precision][lenmodifier]convtype
flags
标志 | 说明 |
---|---|
' | (撇号)将整数按千位分组字符 |
- | 在字段内左对齐输出 |
+ | 总是显示带符号转换的正负号 |
(空格) | 如果第一个字符不是正负号,则在其前面加上一个空格 |
# | 指定另一种转换形式(例如,对于十六进制格式,加0x前缀) |
0 | 添加前导0(而非空格)进行填充 |
fldwidth
长度修饰符 | 说明 |
---|---|
hh | 将相应的参数按signed 或unsigned char 类型输出 |
h | 将相应的参数按signed 或unsigned short 类型输出 |
l | 将相应的参数按signed 或unsigned long 或宽字符类型输出 |
ll | 将相应的参数按signed 或unsigned long long 类型输出 |
j | intmax_t 或uintmax_t |
z | size_t |
t | ptrdiff_t |
L | long double |
precision
precision 说明整型转换后最少输出数字位数、浮点数转换后小数 点后的最少位数、字符串转换后最大字节数。精度是一个点(.),其 后跟随一个可选的非负十进制数或一个星号(*)。宽度和精度字段两者皆可为*。此时,一个整型参数指定宽度或精 度的值。该整型参数正好位于被转换的参数之前。
lenmodifier
长度修饰符 | 说明 |
---|---|
hh | 将相应的参数按 signed 或 unsigned char 类型输出 |
h | 将相应的参数按 signed 或 unsigned short 类型输出 |
l | 将相应的参数按 signed 或 unsigned long 或宽字符类型输出 |
ll | 将相应的参数按 signed 或 unsigned long long 类型输出 |
j | intmax_t 或 uintmax_t |
z | size_t |
t | ptrdiff_t |
L | long double |
convtype
转换类型 | 说明 |
---|---|
d, i | 有符号十进制 |
o | 无符号八进制 |
u | 无符号十进制 |
x, X | 无符号十六进制 |
f, F | 双精度浮点数 |
e, E | 指数格式双精度浮点数 |
g, G | 根据转换后的值解释为 f, F 、e 或 E |
a, A | 十六进制指数格式双精度浮点数 |
c | 字符(若带长度修饰符 l ,为宽字符) |
s | 字符串(若带长度修饰符 l ,为宽字符串) |
p | 指向 void 的指针 |
n | 到目前为止,此次 printf 调用输出的字符的数目将被写入到指针所指向的带符号整数型中 |
% | 一个字符 % |
C | 宽字符(XSI 扩展,等效于 lc ) |
S | 宽字符串(XSI 扩展,等效于 ls ) |
示例
格式化输出一个带符号的双精度浮点数,要求如下:
- 使用 + 标志以显示正号或负号。
- 设定字段宽度为 10。
- 设定小数点后精度为 3。
#include <stdio.h>
int main() { long double num = 123.456789L; printf("格式化输出:%+10.3Lf\n", num); return 0;}
输出为
格式化输出: +123.457
- 带有正负号
- 小数点后精度三位
- 输出字段宽度为10(不足10,内容前自动补充空格)