2249 字
11 分钟
标准IO(四):格式化IO【Unix编程】

格式化输出函数#

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:指向输出流的指针,例如 stdoutstderr 或通过 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, ...);

作用
snprintfsprintf 的安全版本,它最多写入 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将相应的参数按signedunsigned char类型输出
h将相应的参数按signedunsigned short类型输出
l将相应的参数按signedunsigned long或宽字符类型输出
ll将相应的参数按signedunsigned long long类型输出
jintmax_tuintmax_t
zsize_t
tptrdiff_t
Llong double

precision#

precision 说明整型转换后最少输出数字位数、浮点数转换后小数 点后的最少位数、字符串转换后最大字节数。精度是一个点(.),其 后跟随一个可选的非负十进制数或一个星号(*)。宽度和精度字段两者皆可为*。此时,一个整型参数指定宽度或精 度的值。该整型参数正好位于被转换的参数之前。

lenmodifier#

长度修饰符说明
hh将相应的参数按 signedunsigned char 类型输出
h将相应的参数按 signedunsigned short 类型输出
l将相应的参数按 signedunsigned long 或宽字符类型输出
ll将相应的参数按 signedunsigned long long 类型输出
jintmax_tuintmax_t
zsize_t
tptrdiff_t
Llong double

convtype#

转换类型说明
d, i有符号十进制
o无符号八进制
u无符号十进制
x, X无符号十六进制
f, F双精度浮点数
e, E指数格式双精度浮点数
g, G根据转换后的值解释为 f, FeE
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,内容前自动补充空格)
标准IO(四):格式化IO【Unix编程】
https://milkfunc.top/posts/unix环境高级编程学习摘要/标准io/标准io四格式化io/
作者
CapCake
发布于
2025-07-13
许可协议
CC BY-NC-SA 4.0