格式化输出函数
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,内容前自动补充空格)
鲁公网安备37011302000501号