fwprintf , wprintf 和 swprintf 子例程
用途
打印格式化的宽字符输出。
库
标准库 (libc.a)
语法
#include <stdio.h>
#include <wchar.h> int fwprintf ( FILE * stream, const wchar_t * format, . . .)
int wprintf (const wchar_t * format, . .)
int swprintf (wchar_t *s, size_t n, const wchar_t * format, . . .)描述
富普林特夫 函数将输出放置在指定的输出流上。 温普林特夫 函数将输出放在标准输出流 标准输出上。 斯普林特夫 函数将输出后跟以 * 秒开头的连续宽字符中的空宽字符; 写入的宽字符数不超过 N 个,其中包括始终添加的终止空宽字符 (除非 N 为零)。
这些函数中的每个函数都在 格式 宽字符字符串的控制下转换,格式化和打印其自变量。 格式 由零个或多个伪指令组成: 普通宽字符,这些伪指令仅复制到输出流和 转换规范 ,每个伪指令都会导致访存零个或多个自变量。 如果 格式。 没有足够的参数,那么未定义结果 如果在参数保留时 格式 已耗尽,那么将对多余的参数进行求值,否则将忽略这些参数。
可以将 EX 转换应用于自变量列表中 格式 之后的 第 N 自变量,而不是应用于下一个未使用的自变量。 在此情况下,转换宽字符% (请参阅下文) 将替换为序列 %n$,其中 n 是范围 [1 , {NL_ARGMAX}] 内的十进制整数,从而提供自变量在自变量列表中的位置。 此功能部件提供格式宽字符字符串的定义,这些字符串按适合特定语言的顺序选择自变量 (请参阅 "示例" 部分)。
在包含 %n$ 格式的转换规范的格式宽字符字符串中,可以根据需要从格式宽字符字符串中引用参数列表中的编号参数。
在包含转换规范的% 形式的格式宽字符字符串中,参数列表中的每个参数正好使用一次。
所有形式的 富普林特夫 函数都允许在输出字符串中插入依赖于语言的基字符,并以宽字符值形式输出。 基字符是在程序的语言环境 (类别 LC_NUMERIC) 中定义的。 在 POSIX 语言环境中,或者在未定义基字符的语言环境中,基字符缺省为句点 (.)。
每个转换规范由% 宽字符或宽字符序列 %n$ 引入,在此之后以下内容将按顺序显示:
- 零个或零个以上 标志 (按任意顺序) ,用于修改转换规范的含义。
- 可选的最小值 字段宽度。 如果转换后的值的宽字符数少于字段宽度,那么缺省情况下将在左侧填充空格; 如果对字段宽度指定了下面描述的左调整标志 (-) ,那么将在右侧填充该值。 字段宽度采用星号 (*) 的形式 (如下所述) 或十进制整数。
- 一个可选 精度 ,它提供要针对 d , i , o , u , X 和 X 转换显示的最小位数; 要在 e , E 和 f 转换的基字符之后出现的位数; g 和 G 转换的最大有效位数; 或要从字符串打印的最大宽字符数 (以 s 转换为单位)。 精度采用句点 (.) 的形式,后跟星号 (*) (如下所述) 或可选的十进制数字字符串,其中空数字 0 被视为 0。 如果精度与任何其他转换宽字符一起出现,那么行为未定义。
- 可选的 我 (小写 我的) , 我的, H, H, D 或 DD 指定下列其中一个转换:
- 可选 我 ,用于指定以下 C 转换宽字符适用于 温特 自变量。
- 可选 我 ,用于指定以下 S 转换宽字符适用于 wchar_t 自变量。
- 可选的 我 ,指定以下 D, 一, O, 乌, X 或 X 转换宽字符应用于类型 隆英特 或 无符号长整型整数 自变量。
- 可选的 我 ,指定以下 N 转换宽字符应用于指向类型 隆英特 自变量的指针。
- 一个可选 我的 ,指定以下 E, E, F, G 或 G 转换宽字符适用于类型 长双倍 参数。
- 可选 H ,指定以下 D, 一, O, 乌, X 或 X 转换宽字符应用于类型 短整数 或类型 无符号短整型 参数 (将根据整体提升进行提升的参数,并且其值将在打印前转换为类型 短整数 或 无符号短整型 )。
- 可选的 H ,指定以下 N 转换宽字符应用于指向类型 短整数 自变量的指针。
- 一个可选 H ,用于指定以下 E, E, F, G或 G 转换宽字符适用于 _Decimal32 参数。
- 一个可选 D ,用于指定以下 E, E, F, G或 G 转换宽字符适用于 _Decimal64 参数。
- 一个可选 DD ,用于指定以下 E, E, F, G或 G 转换宽字符适用于 _Decimal128 参数。
- 转换宽字符 ,用于指示要应用的转换类型。
字段宽度或精度或两者都可以用星号 (*) 表示。 在此情况下, int 类型的自变量提供字段宽度或精度。 指定字段宽度和/或精度的参数必须按该顺序出现在要转换的参数 (如果有) 之前。 将负字段宽度作为一个标志,后跟正字段宽度。 采用负精度,就好像省略了 EX 精度一样。 在包含转换规范的 %n$ 形式的格式宽字符字符串中,字段宽度或精度可以由序列 * m$ 指示,其中 m 是范围 [1 , {NL_ARGMAX}] 中的十进制整数,给出包含字段宽度或精度的整数自变量在自变量列表中的位置 (在格式自变量之后) ,例如:
wprintf(L"%1$d:%2$.*3$d:%4$.*3$d\n", hour, min, precision, sec);格式 可以包含编号参数规范 (即, %n$ 和 * m$) , ) 或未编号参数规范 (即,% 和 *) ,但通常不能同时包含这两者。 唯一例外的情况是%% 可以与 %n$ 表单混合使用。 未定义在 格式 宽字符字符串中混合编号和未编号参数指定项的结果。 使用编号参数规范时,指定第 N 个参数时,需要在格式宽字符字符串中指定从第 1 个到第 (N-1) 个的所有前导参数。
标志宽字符及其含义如下:
| 项 | 描述 |
|---|---|
| ' | 十进制转换的结果的整数部分 (%i, %d, %u, %f, %g 或 %G) 将使用数千个 ' 分组宽字符进行格式化。 对于其他转换,未定义行为。 使用非货币性分组宽字符。 |
| - | 转换的结果将在该字段中左对齐。 如果未指定此标志,那么转换将是右对齐的。 |
| + | 已签署转换的结果将始终以符号 (+ 或-) 开头。 如果未指定此标志,那么仅当转换负值时,转换才会以符号开始。 |
| 空间/空格/空号脉冲 (space) | 如果已签名转换的第一个宽字符不是符号,或者如果已签名转换导致不存在宽字符,那么将为结果添加空格。 这意味着,如果空格和 + 标志都出现,那么将忽略空格标志。 |
| # | 此标志指定将该值转换为备用表单。 对于 o 转换,它会提高精度 (如果需要) 以将结果的第一个数字强制为 0。 对于 x 或 X 转换,非零结果将以 0x (或 0X) 作为前缀。 对于 e , E , f , g 或 G 转换,结果将始终包含基字符,即使没有任何数字跟在它后面也是如此。 如果没有此标志,那么只有在数字跟在它后面的情况下,基字符才会出现在这些转换的结果中。 对于 g 和 G 转换,将从结果中移除尾部零 不 ,因为它们通常是这样的。 其他转换,没有定义其行为。 |
| 重大安全事件数量 | 对于 d , i , o , u , x , X , e , E , f , g 和 G 转换,前导零 (在符号或基的任何指示后) 用于填充到字段宽度; 不执行空格填充。 如果同时出现 0 和-flags , 0 将忽略 0 标志。 对于 d , i , o , u , x 和 x 转换,如果指定了精度,那么将忽略 0 标志。 如果 0 和 ' 两个标志都出现,在零填充之前插入分组宽字符。 其他转换,没有定义其行为。 |
转换宽字符及其含义如下所示:
| 项 | 描述 |
|---|---|
| 德岛 | 国际 参数将转换为样式 [-] 达德中的带符号十进制。 精度指定要出现的最小数字数; 如果要转换的值可以用更少的数字表示,那么将使用前导零展开。 缺省精度为 1。 在显式精度 0 0 的情况下转换 0 的结果是没有宽字符。 |
| o | 无符号整数 参数将转换为样式 达德中的无符号八进制格式。 精度指定要出现的最小数字数; 如果要转换的值可以用更少的数字表示,那么将使用前导零展开。 缺省精度为 1。 在显式精度 0 0 的情况下转换 0 的结果是没有宽字符。 |
| u | 在样式 达德中, 无符号整数 自变量转换为无符号十进制格式。 精度指定要出现的最小数字数; 如果要转换的值可以用更少的数字表示,那么将使用前导零展开。 缺省精度为 1。 在显式精度 0 0 的情况下转换 0 的结果是没有宽字符。 |
| X | 在样式 达德中, 无符号整数 参数将转换为无符号十六进制格式; 将使用字母 abcdef。 精度指定要出现的最小数字数; 如果要转换的值可以用更少的数字表示,那么将使用前导零展开。 缺省精度为 1。 在显式精度 0 0 的情况下转换 0 的结果是没有宽字符。 |
| X | 行为与 x 转换宽字符相同,只是使用了字母 ABCDEF 而不是 abcdef。 |
| f | double 自变量将转换为样式 [-] ddd.ddd中的十进制表示法,其中基数字符后的位数等于精度规范。 如果缺少精度,那么它将作为 6; 如果精度显式为 0 并且不存在 # 标志,那么不会出现任何基数字符。 如果出现基数字符,那么在它之前至少出现一个数字。 该值将舍入为适当的数字位数。 |
| fwprintf 函数系列可能为无穷大和 NaN提供宽字符字符串表示。 | |
| E , E | double 自变量以样式 [-] d.ddde +/-dd进行转换,其中,在基数字符 (如果自变量非零,那么为非零) 之前有一个数字,在该数字之后有等于精度的位数; 如果缺少精度,那么将其作为 6; 如果精度为 0 且不存在 # 标志,那么不会显示基数字符。 该值将舍入为适当的数字位数。 E 转换宽字符将生成一个带有 E 的数字,而不是 e 引入该指数。 指数通常至少包含两个数字。 如果值为 0 ,那么指数为 0。 |
| fwprintf 函数系列可能为无穷大和 NaN提供宽字符字符串表示。 | |
| G , G | 双 参数在样式 f 或 e (或者在 G 转换宽字符的情况下在样式 E 中) 中进行转换,并且精确指定有效数字的数量。 如果显式精度为 0 ,那么它将作为 1。 使用的样式取决于转换后的数值;只有当转换后的指数小于-4或大于或等于精度时,才会使用样式 e(或 E)。 将从结果的小数部分中除去尾部零; 仅当后跟数字时,才会出现基数字符。 |
| fwprintf 函数系列可能为无穷大和 NaN提供宽字符字符串表示。 | |
| c | 如果不存在 l (ell) 限定符,那么会将 国际 参数转换为宽字符,就像调用 布托克 函数一样,并且会写入生成的宽字符。 否则, 温特 参数将转换为 wchar_t , 并写入。 |
| 请 | 如果不存在 l (ell) 限定符,那么自变量必须是指向字符数组的指针,该字符数组包含以初始移位状态开始的字符序列。 数组中的字符将像通过对 姆布尔托克 函数的重复调用一样进行转换,在转换第一个字符之前, mbstate_t 对象所描述的转换状态将初始化为零,并且写入 (但不包括) 终止的空宽字符。 如果指定了精度,那么写入的宽字符数不会超过那么多。 如果未指定精度或精度大于数组的大小,那么数组必须包含空的宽字符。 |
| 如果存在 l (ell) 限定符,那么自变量必须是指向类型为 wchar_t。 的数组的指针 数组中的宽字符将写入到 (但不包括) 终止空的宽字符。 如果未指定任何精度或大于数组的大小,那么数组必须包含空的宽字符。 如果指定了精度,那么写入的宽字符数不会超过那么多。 | |
| p | 参数必须是指向 void 的指针。 以依赖于实现的方式将指针的值转换为可打印的宽字符序列。 该自变量必须是一个指向整数的指针,该整数将通过此调用其中一个 富普林特夫 函数写入到输出中的宽字符数写入到该输出中。 未转换任何自变量。 |
| C | 与 lc 相同。 |
| 六 | 与 ls 相同。 |
| % | 输出一个% 宽字符; 不转换任何自变量。 整个转换指定项必须为 %%。 |
如果转换规范与上述其中一种形式不匹配,那么表示行为未定义。
在任何情况下,不存在的字段宽度或较小的字段宽度都不会导致字段截断; 如果转换结果比字段宽度更宽,那么只会展开字段以包含转换结果。 将显示由 富普林特夫 和 温普林特夫 生成的字符,如同已调用 弗普特韦克 一样。
文件的 st_ctime 和 st_mtime 字段将标记为在成功执行 富普林特夫 或 温普林特夫 的调用与下一次成功完成对同一流的 弗卢什 或 弗夫关 的调用或退出或异常终止的调用之间进行更新。
返回值
成功完成后,这些函数将返回传输的宽字符数 (如果为 斯普林特夫 ,那么不包括终止的空宽字符) 或负值 (如果迂到输出错误)。
错误代码
有关 富普林特夫 和 温普林特夫 将失败且可能失败的情况,请参阅 弗普特韦克。 此外,在以下情况下,所有形式的 富普林特夫 都可能失败:
| 项 | 描述 |
|---|---|
| EILSEQ | 已检测到与有效字符不对应的宽字符代码 |
| EINVAL | 没有足够的参数。 |
| 此外,在以下情况下, 温普林特夫 和 富普林特夫 可能会失败: | |
| ENOMEM | 没有足够的存储空间可用。 |
在以下情况下, 斯普林特夫 将失败:
| 项 | 描述 |
|---|---|
| Eoverflow | N 的值大于 {INT_MAX} ,或者用于保存输出 (不包括终止 null) 所需的字节数大于 {INT_MAX}。 |
示例
要打印与语言无关的日期和时间格式,可以使用下列语句:
wprintf (format, weekday, month, day, hour, min);对于美国的用法,格式可以是指向宽字符字符串的指针:
L"%s, %s %d, %d:%.2d\n"生成消息:
Sunday, July 3, 10:02而对于德语用法,格式可以是指向宽字符字符串的指针:
L"%1$s, %3$d. %2$s, %4$d:%5$.2d\n"生成消息:
Sonntag, 3. July, 10:02