fwscanf_s
wscanf, fwscanf, swscanf, wscanf_s, fwscanf_s, swscanf_s
Defined in header | ||
---|---|---|
(1) | ||
int wscanf( const wchar_t *format, ... | (since C95) (until C99) | |
int wscanf( const wchar_t *restrict format, ... | (since C99) | |
(2) | ||
int fwscanf( FILE *stream, const wchar_t *format, ... | (since C95) (until C99) | |
int fwscanf( FILE *restrict stream, const wchar_t *restrict format, ... | (since C99) | |
(3) | ||
int swscanf( const wchar_t *buffer, const wchar_t *format, ... | (since C95) (until C99) | |
int swscanf( const wchar_t *restrict buffer, const wchar_t *restrict format, ... | (since C99) | |
int wscanf_s( const wchar_t *restrict format, ... | (4) | (since C11) |
int fwscanf_s( FILE *restrict stream, const wchar_t *restrict format, ... | (5) | (since C11) |
int swscanf_s( const wchar_t *restrict s, const wchar_t *restrict format, ... | (6) | (since C11) |
从各种来源读取数据,根据其解释并将format
结果存储到给定位置。
1)从中读取数据stdin
。
2)从文件流中读取数据stream
。
3)从空终止的宽字符串中读取数据buffer
。到达字符串的末尾等同于达到文件结束条件fwscanf
4-6)同(1-3),所不同的是%c
,%s
和%[
转换说明每个期望两个参数(通常的指针和类型的值rsize_t
指示所述接收阵列的大小,其可以是1附有%LC读取时成一个单一的宽字符),除了在运行时检测到以下错误并调用当前安装的约束处理函数:
- 指针类型的任何参数都是空指针
由于所有的边界检查功能,wscanf_s,fwscanf_s,和swscanf_s仅保证可供如果__STDC_LIB_EXT1__由实现所定义,并且如果用户定义__STDC_WANT_LIB_EXT1__的整数常数1,包括之前<wchar.h>。
参数
流 | - | 输出文件流写入 |
---|---|---|
缓冲 | - | 指向要写入的宽字符字符串的指针 |
bufsz | - | 最多bufsz-1可以编写宽字符,加上空终止符 |
格式 | - | 指向以空字符结尾的宽字符串的指针,指定如何解释数据。 |
格式字符串由普通的宽字符(除外%)组成,它们被不变地复制到输出流和转换规范中。每个转换规范具有以下格式: | ||
介绍%人物 | ||
(可选)一个或多个修改转换行为的标志: | ||
-:转换的结果在字段内左对齐(默认情况下它是右对齐的) | ||
+:带符号转换的符号总是预设为转换结果的前缀(默认情况下结果前面为减号,仅当它为负值时) | ||
空格:如果签名转换的结果不是以符号字符开头,或者是空的,则空格会预设为结果。如果+标志存在,它将被忽略。 | ||
#:执行转换的替代形式。请参阅下表以了解确切的效果,否则行为未定义。 | ||
0:对于整数和浮点数转换,前导零用于填充字段而不是空格字符。对于整数,如果明确指定了精度,它将被忽略。对于使用此标志的其他转换会导致未定义的行为。如果-标志存在,它将被忽略。 | ||
(可选)整数值或*指定最小字段宽度。如果需要,结果会填充空格字符(默认情况下),右侧对齐时填充空白字符,左侧填充右侧填充。在使用的情况下*,宽度由类型的附加参数指定int。如果参数的值是负数,则结果是-指定的标志和正的字段宽度。(注意:这是最小宽度:该值从不被截断。) | ||
(可选) .后面跟随整数或者*或者既不指定转换的精度。在使用的情况下*,精度由类型的附加参数指定int。如果这个参数的值是负数,它将被忽略。如果既不使用数字也不*使用,则精度取为零。请参阅下表以了解精确度的确切影响。 | ||
(可选) 长度修饰符,用于指定参数的大小 | ||
转换格式说明符 | ||
以下格式说明符可用: | ||
转换 | ||
说明符 | ||
长度修饰符 | ||
% | ||
c | ||
s | ||
d | ||
i | ||
o | ||
x | ||
X | ||
u | ||
f | ||
F | ||
e | ||
E | ||
a | ||
A | ||
(C99)。 | ||
g | ||
G | ||
n | ||
p | ||
浮点转换函数将无穷大转换为inf或infinity。使用哪一个是实现定义的。 | ||
非数字转换为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在相同的调用中打印由较早修改的字符串。 | ||
如果转换规范无效,则行为未定义。 | ||
... | - | 指定要打印的数据的参数 |
- 非空格宽字符除外
%
:格式字符串中的每个这样的字符都只消耗输入流中的一个完全相同的字符,或者如果流中的下一个字符不相等,则会导致函数失败。
以下格式说明符可用:
Conversion
说明符说明参数类型长度修饰符 hh
(C99)。
h
(none) l
ll
(C99).
j
(C99).
z
(C99).
t
(C99).
L
%
匹配字面%
N / AN / AN / AN / AN / AN / AN / AN / AN / A c
一个匹配字符
或序列字符
如果使用宽度
说明,完全匹配宽度
宽字符
(参数必须是一个指向阵列有足够的空间)。与%s和%[不同,不会将空字符
追加到数组。
N/A N/A char*
wchar_t*
N / AN / AN / AN / AN / A s
匹配非空白字符序列(字符串
)如果使用宽度
说明符,则匹配宽度
或直到第一个空白字符,以先出现者为准。除了匹配的字符外,总是存储一个空字符(所以参数数组必须至少有宽度+ 1个
字符的空间)。
`[`set`]` matches a non-empty sequence of character from set of characters. If the first character of the set is `^`, then all characters not in the set are matched. If the set begins with `]` or `^]` then the `]` character is also included into the set. It is implementation-defined whether the character `-` in the non-initial position in the scanset may be indicating a range, as in `[0-9]`. If width specifier is used, matches only up to _width_. Always stores a null character in addition to the characters matched (so the argument array must have room for at least _width+1_ characters).
`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.
`signed char*` or `unsigned char*`
`signed short*` or `unsigned short*`
`signed int*` or `unsigned int*`
`signed long*` or `unsigned long*`
`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):