跳转到内容

printf, fprintf, sprintf : 格式化输出

#include <stdio.h>
int printf(const char *format [, arg, ...]);
int fprintf(FILE *fd, const char *format [, arg, ...]);
int sprintf(char *str, const char *format [, arg, ...]);
```### 描述
printf 接受一系列参数,对每个参数应用来自 *format 的格式说明符,并将格式化后的数据写入 stdout,以空字符结尾。如果没有足够的参数用于格式化,则 printf 的行为是未定义的。printf 在到达格式字符串的末尾时返回。如果参数多于格式所需,多余的参数将被忽略。
fprintf 和 sprintf 与 printf 完全相同,只是格式化输出的目标不同:fprintf 将输出发送到指定的文件 fd,而 sprintf 将输出存储在指定的字符数组 str 中。对于 sprintf,如果输出 *str 与其中一个参数重叠,其行为也是未定义的。format 是一个指向字符字符串的指针,该字符串包含两种类型的对象:普通字符(% 除外),它们被原样复制到输出中;以及转换说明,每个转换说明都以 % 开头。(要在输出中包含 %,请在格式字符串中使用 %%。)转换说明具有以下形式:
%[flags][width][.prec][size][type]
转换说明的各个字段具有以下含义:flags 一个可选的字符序列,用于控制输出对齐、数字符号、小数点、尾随零以及八进制和十六进制前缀。标志字符为减号 (-)、加号 (+)、空格 ( )、零 (0) 和井号 (#)。它们可以以任意组合出现。 - 转换结果左对齐,右侧用空格填充。如果不使用此标志,结果将右对齐,并在左侧填充。 + 有符号转换的结果(由 type 决定)将始终以加号或减号开头。(如果不使用此标志,正值不会以加号开头。)" "(空格)如果有符号转换说明的第一个字符不是符号,或者有符号转换没有产生任何字符,结果将以空格开头。如果空格 ( ) 标志和加号 (+) 标志同时出现,则忽略空格标志。 0 如果 type 字符为 d、i、o、u、x、X、e、E、f、g 或 G:使用前导零来填充字段宽度(在符号或基数的任何指示之后);不使用空格进行填充。如果零 (0) 标志和减号 (-) 标志同时出现,则忽略零 (0) 标志。对于 d、i、o、u、x 和 X 转换,如果指定了精度 prec,则忽略零 (0) 标志。请注意,0 被解释为标志,而不是字段宽度的开头。 # 结果将根据下一个字符转换为另一种形式:0 增加精度以强制结果的第一个数字为零。x 非零结果将带有 0x 前缀。X 非零结果将带有 0X 前缀。e、E 或 f 结果将始终包含小数点,即使小数点后没有数字。(通常,只有当小数点后有数字时才会出现小数点。)尾随零被移除。g 或 G 与 e 或 E 相同,但不移除尾随零。所有其他情况未定义。width width 是一个可选的最小字段宽度。您可以直接将其指定为十进制整数,也可以通过使用星号 (*) 间接指定,在这种情况下,将使用一个 int 参数作为字段宽度。不支持负字段宽度;如果您尝试指定负字段宽度,它将被解释为减号 (-) 标志后跟正字段宽度。prec 一个可选字段;如果存在,则以 `.'(句点)引入。此字段给出转换中要打印的最大字符数;对于类型为 d、i、o、u、x 和 X 的转换,给出要打印的整数的最小位数;对于 g 和 G 转换,给出最大有效位数;或者对于 e、E 和 f 转换,给出小数点后要打印的位数。您可以直接将精度指定为十进制整数,也可以通过使用星号 (*) 间接指定,在这种情况下,将使用一个 int 参数作为精度。提供负精度等同于省略精度。如果仅指定了句点,则精度为零。如果精度与此处列出的转换类型以外的任何其他转换类型一起出现,则行为是未定义的。size h、l 和 L 是可选的大小字符,它们覆盖 printf 解释相应参数数据类型的默认方式。h 强制将后面的 d、i、o、u、x 或 X 转换类型应用于 short 或 unsigned short。h 还强制将后面的 n 类型应用于指向 short 的指针。类似地,l 强制将后面的 d、i、o、u、x 或 X 转换类型应用于 long 或 unsigned long。l 还强制将后面的 n 类型应用于指向 long 的指针。如果 h 或 l 与另一个转换说明符一起出现,则行为是未定义的。L 强制将后面的 e、E、f、g 或 G 转换类型应用于 long double 参数。如果 L 与任何其他转换类型一起出现,则行为是未定义的。type type 指定 printf 执行的转换类型。以下是这些类型的表格:% 打印百分号字符 (%) c 将 arg 作为单个字符打印 s 打印字符,直到达到精度或遇到空终止符;接受一个字符串指针 d 打印有符号十进制整数;接受一个 int(与 i 相同)i 打印有符号十进制整数;接受一个 int(与 d 相同)o 打印有符号八进制整数;接受一个 int u 打印无符号十进制整数;接受一个 int x 打印无符号十六进制整数(使用 abcdef 作为 9 之后的数字);接受一个 int X 打印无符号十六进制整数(使用 ABCDEF 作为 9 之后的数字);接受一个 int f 打印 [-]9999.9999 形式的有符号值;接受一个浮点数 e 打印 [-]9.9999e[+|-]999 形式的有符号值;接受一个浮点数 E 以与 e 相同的方式打印,但使用 E 来引入指数;接受一个浮点数 g 根据给定的值和精度,以 f 或 e 形式打印有符号值——仅在必要时才打印尾随零和小数点;接受一个浮点数 G 以与 g 相同的方式打印,但如果需要指数,则使用 E 表示指数;接受一个浮点数 n 存储(在同一个对象中)已写入字符的计数;接受一个指向 int 的指针 p 以实现定义的格式打印指针。此实现将指针视为 unsigned long(与 Lu 相同)。### 返回值
sprintf 返回输出字符串中的字节数,但不计算结尾的 NULL。printf 和 fprintf 返回传输的字符数。如果发生错误,printf 和 fprintf 返回 EOF。sprintf 不会发生错误返回。
---
**权威来源**: BUSMASTER DITA help source `printf.dita`, compiled into `BUSMASTER.CHM` with the application.