©
本文档使用
php.cn手册 发布
在头文件<wchar.h>中定义 | ||
---|---|---|
(1) | ||
int wscanf(const wchar_t * format,...); | (自C95以来)(直到C99) | |
int wscanf(const wchar_t * restrict format,...); | (自C99以来) | |
(2) | ||
int fwscanf(FILE * stream,const wchar_t * format,...); | (自C95以来)(直到C99) | |
int fwscanf(FILE * restrict stream,const wchar_t * restrict format,...); | (自C99以来) | |
(3) | ||
int swscanf(const wchar_t * buffer,const wchar_t * format,...); | (自C95以来)(直到C99) | |
int swscanf(const wchar_t * restrict buffer,const wchar_t * restrict format,...); | (自C99以来) | |
int wscanf_s(const wchar_t * restrict format,...); | (4) | (自C11以来) |
int fwscanf_s(FILE * restrict stream,const wchar_t * restrict format,...); | (5) | (自C11以来) |
int swscanf_s(const wchar_t * restrict s,const wchar_t * restrict format,...); | (6) | (自C11以来) |
非数字转换为nan
或。使用哪一个是实现定义的。nan(char_sequence)
该转换F
,E
,G
,A
输出INF
,INFINITY
,NAN
来代替。
即使%c
需要int
参数,通过char
调用可变参数函数时发生的整数提升也是安全的。
对于固定宽度的字符类型(正确的转换规格int8_t
<inttypes.h>还(虽然,等等)都在头定义PRIdMAX
,PRIuMAX
等是同义词%jd
,%ju
等)。
内存写入转换说明符%n
是安全漏洞的常见目标,其中格式字符串取决于用户输入,并且不受边界检查printf_s
函数族的支持。
每个转换说明符的操作之后都有一个序列点; 这允许将多个%n
结果存储在相同的变量中,或者作为边缘情况,%n
在同一个调用中打印由较早修改的字符串。
如果转换规范无效,则行为未定义。
... - arguments specifying data to print
1,2)如果发生错误,则成功写入宽字符数或写入负值。
3)如果编码错误发生或者如果要生成的字符数等于或大于size
(包括当size
为零时),则写入的宽字符的数目(不包括终止空宽字符)如果成功或负值。
4,5)如果发生错误,则成功写入宽字符数或写入负值。
6)写入的宽字符数(不包括终止空值)buffer
。返回编码错误和溢出时的负值。对所有其他错误返回零。
7)将已经写入宽字符(不包括终止空)数量buffer
已经bufsz
如果发生错误,已经足够大时,或为负值。(也就是说,只有当回报是非负的且小于时,写才能成功并且完成bufsz
)
虽然窄字符串提供snprintf
了可以确定所需的输出缓冲区大小的可能性,但对于宽字符串没有等效(直到C11的snwprintf_s),并且为了确定缓冲区大小,程序可能需要调用swprintf
,检查结果值,并重新分配一个更大的缓冲区,再次尝试直到成功。
snwprintf_s
不同swprintf_s
,将截断结果以适应指向的数组buffer
,即使截断被大多数边界检查函数视为错误。
N/A N/A char*
#include <locale.h>#include <wchar.h> int main(void){ char narrow_str[] = "z\u00df\u6c34\U0001f34c"; // or "zß水?" // or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9f\x8d\x8c"; wchar_t warr[29]; // the expected string is 28 characters plus 1 null terminator setlocale(LC_ALL, "en_US.utf8"); swprintf(warr, sizeof warr/sizeof *warr, L"Converted from UTF-8: '%s'", narrow_str); wprintf(L"%ls\n", warr);}
N / AN / AN / AN / AN / A s
匹配非空白字符序列(字符串)如果使用宽度说明符,则匹配宽度或直到第一个空白字符,以先出现者为准。除了匹配的字符外,总是存储一个空字符(所以参数数组必须至少有宽度+ 1个字符的空间)。
输出:
`d` matches a **decimal integer**. The format of the number is the same as expected by [`wcstol()`](../string/wide/wcstol) with the value `10` for the `base` argument.
Converted from UTF-8: 'zß水?'
`signed short*` or `unsigned short*`
C11标准(ISO / IEC 9899:2011):
7.29.2.1 fwprintf函数(p:403-410)
7.29.2.3 swprintf函数(p:416)
7.29.2.11 wprintf函数(p:421)
K.3.9.1.1 fwprintf_s函数(p:628)
K.3.9.1.4 swprintf_s函数(p:630-631)
K.3.9.1.13 wprintf_s函数(p:637-638)
C99标准(ISO / IEC 9899:1999):
7.24.2.1 fwprintf函数(p:349-356)
7.24.2.3 swprintf函数(p:362)
7.24.2.11 wprintf函数(p:366)
`signed long long*` or `unsigned long long*`
[`intmax_t`](../types/integer)`*` or [`uintmax_t`](../types/integer)`*`
size_t*
ptrdiff_t*
N / A i
匹配整数。数的格式是相同的通过按预期wcstol()
与值0
的base
参数(基部由解析的第一字符确定)。
`u` matches an unsigned **decimal integer**. The format of the number is the same as expected by [`wcstoul()`](../string/wide/wcstoul) with the value `10` for the `base` argument.
`o` matches an unsigned **octal integer**. The format of the number is the same as expected by [`wcstoul()`](../string/wide/wcstoul) with the value `8` for the `base` argument.
`x`, `X` matches an unsigned **hexadecimal integer**. The format of the number is the same as expected by [`wcstoul()`](../string/wide/wcstoul) with the value `16` for the `base` argument.
`n` returns the **number of characters read so far**. No input is consumed. Does not increment the assignment count. If the specifier has assignment-suppressing operator defined, the behavior is undefined.
`a`, `A`(C99)
e
, E
f
, F
g
,G
匹配一个浮点数。数字的格式与预期的相同wcstof()
。
N/A N/A float*
double*
N/A N/A N/A N/A long double*
`p` matches implementation defined character sequence defining a **pointer**. `printf` family of functions should produce the same sequence using `%p` format specifier.
N/A N/A void**
n
不适用不适用不适用不适用不适用不适用不适用不适用于任何指定字段宽度的最长输入字符序列的 每个转换说明符,或者正是转换说明符所期望的或者是它期望的顺序是从流中消耗的。在消耗序列之后的第一个字符(如果有的话)仍然未读。如果消耗的序列长度为零或消费的序列不能如上所述进行转换,则会发生匹配失败,除非文件结束,编码错误或读取错误阻止了来自流的输入,在这种情况下,它是输入失败。
在尝试解析输入之前,除了[
,,之外的所有转换说明符都会消耗并放弃所有前导空白字符(如同通过调用一样确定)。这些消耗的字符不会计入指定的最大字段宽度。cniswspace
如果l
未使用长度说明符,则转换说明符c
,s
并[
执行宽到多字节字符转换,就像通过在第一个字符转换之前使用初始化为零wcrtomb()
的mbstate_t
对象调用一样。
除了匹配的字符之外,转换说明符s
并[
始终存储空终止符。目标数组的大小必须至少比指定的字段宽度大1。在不指定目标数组大小的情况下,使用%s
或%[
不安全gets
。
对于固定宽度的整数类型(正确的转换规格int8_t
<inttypes.h>还(虽然,等等)都在头定义SCNdMAX
,SCNuMAX
等是同义词%jd
,%ju
等)。
每个转换说明符的操作之后都有一个序列点; 这允许将多个字段存储在相同的“汇”变量中。
在解析指数中不包含数字的不完整浮点值时(例如"100er"
使用转换说明符进行解析),会消耗%f
序列"100e"
(可能有效的浮点数的最长前缀),从而导致匹配错误(消耗的序列不能转换为浮点数),"r"
剩余的。现有的实现不遵循此规则并仅回滚消耗"100"
,只留下"er"
例如glibc错误1765。
... - receiving arguments
1-3)成功分配的接收参数数目,或者EOF
在分配第一个接收参数前发生读取失败。
4-6)与(1-3)相同,但是EOF
如果存在运行时约束冲突,也会返回。
C11标准(ISO / IEC 9899:2011):
7.29.2.2 fwscanf功能(p:410-416)
7.29.2.4 swscanf函数(p:417)
7.29.2.12 wscanf函数(p:421)
K.3.9.1.2 fwscanf_s函数(p:628-629)
K.3.9.1.5 swscanf_s函数(p:631)
K.3.9.1.14 wscanf_s函数(p:638)
C99标准(ISO / IEC 9899:1999):
7.24.2.2 fwscanf函数(p:356-362)
7.24.2.4 swscanf函数(p:362)
7.24.2.12 wscanf函数(p:366-367)