首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

fwscanf_s

Defined in header <wchar.h>

(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读取时成一个单一的宽字符),除了在运行时检测到以下错误并调用当前安装的约束处理函数:

  • 指针类型的任何参数都是空指针
  • formatstream或者buffer是空指针
  • %c,%s或%[,加上终止空字符,将会超过为每个转换说明符提供的第二个(rsize_t)参数所写的字符数
  • 可选地,还有任何其他可检测到的错误,例如未知的转换说明符

由于所有的边界检查功能,wscanf_sfwscanf_s,和swscanf_s仅保证可供如果__STDC_LIB_EXT1__由实现所定义,并且如果用户定义__STDC_WANT_LIB_EXT1__的整数常数1,包括之前<wchar.h>

参数

-

输出文件流写入

缓冲

-

指向要写入的宽字符字符串的指针

bufsz

-

最多bufsz-1可以编写宽字符,加上空终止符

格式

-

指向以空字符结尾的宽字符串的指针,指定如何解释数据。

格式字符串由普通的宽字符(除外%)组成,它们被不变地复制到输出流和转换规范中。每个转换规范具有以下格式:

介绍%人物

(可选)一个或多个修改转换行为的标志:

-:转换的结果在字段内左对齐(默认情况下它是右对齐的)

+:带符号转换的符号总是预设为转换结果的前缀(默认情况下结果前面为减号,仅当它为负值时)

空格:如果签名转换的结果不是以符号字符开头,或者是空的,则空格会预设为结果。如果+标志存在,它将被忽略。

#:执行转换的替代形式。请参阅下表以了解确切的效果,否则行为未定义。

0:对于整数和浮点数转换,前导零用于填充字段而不是空格字符。对于整数,如果明确指定了精度,它将被忽略。对于使用此标志的其他转换会导致未定义的行为。如果-标志存在,它将被忽略。

(可选)整数值或*指定最小字段宽度。如果需要,结果会填充空格字符(默认情况下),右侧对齐时填充空白字符,左侧填充右侧填充。在使用的情况下*,宽度由类型的附加参数指定int。如果参数的值是负数,则结果是-指定的标志和正的字段宽度。(注意:这是最小宽度:该值从不被截断。)

(可选) .后面跟随整数或者*或者既不指定转换的精度。在使用的情况下*,精度由类型的附加参数指定int。如果这个参数的值是负数,它将被忽略。如果既不使用数字也不*使用,则精度取为零。请参阅下表以了解精确度的确切影响。

(可选) 长度修饰符,用于指定参数的大小

转换格式说明符

以下格式说明符可用:

转换

说明

参数类型

说明符

长度修饰符

hh

h

(没有)

l

ll

j

z

t

L

(C99)。

(C99)。

(C99)。

(C99)。

(C99)。

%

写文字%。完整的转换规范必须是%%。

N / A

N / A

N / A

N / A

N / A

N / A

N / A

N / A

N / A

c

写一个字符。

N / A

N / A

int

wint_t

N / A

N / A

N / A

N / A

N / A

参数首先被转换wchar_t为仿佛通过调用btowc。如果使用l修饰符,wint_t则首先将参数转换为wchar_t。

s

写入一个字符串

N / A

N / A

char*

wchar_t*

N / A

N / A

N / A

N / A

N / A

参数必须是一个指向包含从初始转换状态开始的多字节字符序列的字符数组的初始元素的指针,该数组转换为宽字符数组,就像通过调用mbrtowc具有零初始化转换状态一样。Precision指定要写入的最大宽字符数。如果未指定Precision,则将每个宽字符写入并不包括第一个空终止符。如果使用l说明符,参数必须是指向数组的初始元素的指针wchar_t。

d

将有符号整数转换为十进制表示形式[ - ] dddd。

signed char

short

int

long

long long

intmax_t

签 size_t

ptrdiff_t

N / A

i

精度指定出现的最小位数。默认的精度是1。

如果转换后的值和精度都是​0​没有字符的转换结果。

o

将无符号整数转换为八进制表示oooo。

unsigned char

unsigned short

unsigned int

unsigned long

unsigned long long

uintmax_t

size_t

未签名的版本 ptrdiff_t

N / A

精度指定出现的最小位数。默认的精度是1。如果转换后的值和精度都是​0​没有字符的转换结果。在替代实现中,如果需要,可以增加精度以写入一个前导零。在这种情况下,如果转换后的值和精度都是​0​,​0​写入单个。

x

将无符号整数转换为十六进制表示hhhh。

N / A

X

使用x转换字母abcdef。

使用X转换字母ABCDEF。

精度指定出现的最小位数。默认的精度是1。如果转换后的值和精度都是​0​没有字符的转换结果。在替代实现中, 0x或者0X如果转换后的值不为零,则将其作为结果的前缀。

u

将无符号整数转换为十进制表示形式dddd。

N / A

精度指定出现的最小位数。默认的精度是1。如果转换后的值和精度都是​0​没有字符的转换结果。

f

将浮点数转换为样式[ - ] ddd.ddd中的十进制表示法。

N / A

N / A

double

double(C99)

N / A

N / A

N / A

N / A

long double

F

精度指定小数点后面出现的最小位数。默认的精度是6。在替代实现中,即使没有数字跟随,小数点字符也会被写入。对于无穷大和非数字转换风格,请参阅注释。

e

将浮点数转换为十进制指数符号。

N / A

N / A

N / A

N / A

N / A

N / A

E

对于e转换样式,使用[ - ] d.ddd e±dd。

对于E转换样式,使用[ - ] d.ddd E±dd。

指数至少包含两位数字,只有在必要时才使用更多数字。如果值是​0​,指数也是​0​。精度指定小数点后面出现的最小位数。默认的精度是6。在替代实现中,即使没有数字跟随,小数点字符也会被写入。对于无穷大和非数字转换风格,请参阅注释。

a

将浮点数转换为十六进制指数表示法。

N / A

N / A

N / A

N / A

N / A

N / A

A

对于a转换样式,使用[ - ] 0xh.hhh p±d。

(C99)。

对于A转换样式,使用[ - ] 0Xh.hhh P±d。如果参数不是标准化的浮点值,则

第一个十六进制数字是0。如果值是​0​,指数也是​0​。精度指定小数点后面出现的最小位数。默认精度足以精确表示值。在替代实现中,即使没有数字跟随,小数点字符也会被写入。对于无穷大和非数字转换风格,请参阅注释。

g

根据值和精度将浮点数转换为十进制或十进制指数符号。

N / A

N / A

N / A

N / A

N / A

N / A

G

对于g风格转换的转换与风格e或f将被执行。

对于G风格转换的转换与风格E或F将被执行。

让P等于精度如果非零,6如果没有指定精度,或者1如果精度是​0​。然后,如果具有样式的转换E将具有以下指数X:

如果P> X≥-4,转换是用式f或F和精度P - 1 - X。

否则,转换采用样式e或E精度P - 1。

除非请求替代表示,否则尾随零将被删除,如果没有剩余小数部分,小数点字符也会被删除。对于无穷大和非数字转换风格,请参阅注释。

n

将此调用到目前为止写入的字符数返回给该函数。

signed char*

short*

int*

long*

long long*

intmax_t*

签 size_t*

ptrdiff_t*

N / A

结果写入参数指向的值。规范可能不包含任何标志,字段宽度或精度。

p

写一个实现定义的字符序列来定义一个指针。

N / A

N / A

void*

N / A

N / A

N / A

N / A

N / A

N / A

浮点转换函数将无穷大转换为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在相同的调用中打印由较早修改的字符串。

如果转换规范无效,则行为未定义。

...

-

指定要打印的数据的参数

  • 非空格宽字符除外%:格式字符串中的每个这样的字符都只消耗输入流中的一个完全相同的字符,或者如果流中的下一个字符不相等,则会导致函数失败。
  • 空白字符:格式字符串中的任何单个空白字符都会消耗输入中所有可用的连续空白字符(如同通过调用iswspace循环来确定)。请注意,有没有什么区别"\n"" ""\t\t"在格式字符串或其他空白。
  • 转换规格。每个转换规范具有以下格式:
    • 介绍%人物
    • (可选)分配抑制字符*。如果存在此选项,则函数不会将转换结果分配给任何接收参数。
    • (可选)指定最大字段宽度的整数数字(大于零),即该函数在执行由当前转换规范指定的转换时允许使用的最大字符数。请注意,如果未提供宽度,%s和%[可能会导致缓冲区溢出。
    • (可选)长度修饰符,用于指定接收参数的大小,即实际的目标类型。这会影响转换精度和溢出规则。每种转换类型的默认目标类型都不相同(请参阅下表)。
    • 转换格式说明符

以下格式说明符可用:

代码语言:txt
复制
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个字符的空间)。

代码语言:txt
复制
 `[`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).
代码语言:txt
复制
 `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.
代码语言:txt
复制
`signed char*` or `unsigned char*` 
代码语言:txt
复制
`signed short*` or `unsigned short*` 
代码语言:txt
复制
`signed int*` or `unsigned int*` 
代码语言:txt
复制
`signed long*` or `unsigned long*` 
代码语言:txt
复制
`signed long long*` or `unsigned long long*` 
代码语言:txt
复制
[`intmax_t`](../types/integer)`*` or [`uintmax_t`](../types/integer)`*` 

size_t*

ptrdiff_t*

N / A i 匹配整数。数的格式是相同的通过按预期wcstol()与值​0​base参数(基部由解析的第一字符确定)。

代码语言:txt
复制
 `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.
代码语言:txt
复制
 `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.
代码语言:txt
复制
 `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.
代码语言:txt
复制
 `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.
代码语言:txt
复制
 `a`, `A`(C99)

e, E

f, F

gG 匹配一个浮点数。数字的格式与预期的相同wcstof()

N/A N/A float*

double*

N/A N/A N/A N/A long double*

代码语言:txt
复制
 `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未使用长度说明符,则转换说明符cs[执行宽到多字节字符转换,就像通过在第一个字符转换之前使用初始化为零wcrtomb()mbstate_t对象调用一样。

除了匹配的字符之外,转换说明符s[始终存储空终止符。目标数组的大小必须至少比指定的字段宽度大1。在不指定目标数组大小的情况下,使用%s%[不安全gets

对于固定宽度的整数类型(正确的转换规格int8_t<inttypes.h>还(虽然,等等)都在头定义SCNdMAXSCNuMAX等是同义词%jd%ju等)。

每个转换说明符的操作之后都有一个序列点; 这允许将多个字段存储在相同的“汇”变量中。

在解析指数中不包含数字的不完整浮点值时(例如"100er"使用转换说明符进行解析),会消耗%f序列"100e"(可能有效的浮点数的最长前缀),从而导致匹配错误(消耗的序列不能转换为浮点数),"r"剩余的。现有的实现不遵循此规则并仅回滚消耗"100",只留下"er"例如glibc错误1765

代码语言:txt
复制
 ...   -   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)

扫码关注腾讯云开发者

领取腾讯云代金券