wscanf, fwscanf, swscanf, wscanf_s, fwscanf_s, swscanf_s
| 定义于头文件 <wchar.h>
|
||
int wscanf( const wchar_t* format, ... );
|
(1) | (自 C95) (直至 C99) |
int wscanf( const wchar_t* restrict format, ... );
|
(自 C99) | |
int fwscanf( FILE* stream, const wchar_t* format, ... );
|
(2) | (自 C95) (直至 C99) |
int fwscanf( FILE* restrict stream,
const wchar_t* restrict format, ... );
|
(自 C99) | |
int swscanf( const wchar_t* buffer, const wchar_t* format, ... );
|
(3) | (自 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) |
从多种来源读取数据,根据 format 对其进行解释,并将结果存储到指定位置。
stream 读取数据。buffer 读取数据。到达字符串末尾等同于到达 fwscanf%c,但 %s、%[ 和 转换说明符各自期望两个参数(通常的指针和一个类型为 rsize_t1 的值,指示接收数组的大小,当使用 %lc 读取单个宽字符时,该值可为 ),且以下错误会在运行时检测到,并调用当前已安装的 约束处理函数- :
format任何指针类型的参数为空指针stream、buffer或- 为空指针
%c由%s、%[或rsize_t将写入的字符数(加上终止空字符)会超出为这些转换说明符中每一个提供的第二个( - )参数
wscanf_s 与所有边界检查函数一样,fwscanf_s、swscanf_s 和 __STDC_LIB_EXT1__ 仅在实现定义了 __STDC_WANT_LIB_EXT1__,并且用户在包含 1wchar.h< 之前将 > 定义为整数常量 参数
| stream | - | 要读取的输入文件流 |
| buffer | - | 指向要读取的以空字符结尾的宽字符串的指针 |
| format | - | 指向以空字符结尾的宽字符串的指针,指定如何读取输入 |
| ... | - | 接收参数。 |
format 字符串由以下组成:
- 除
%以外的非空白宽字符:格式字符串中的每个此类字符都会从输入流中消耗一个完全相同的字符,如果流中的下一个字符不相等,则会导致函数失败。 - 空白字符:格式字符串中的任何单个空白字符都会消耗输入中所有连续的空白字符(通过循环调用 iswspace 确定)。请注意,格式字符串中的
"\n"、" "、"\t\t"或其他空白字符之间没有区别。 - 转换说明。每个转换说明具有以下格式:
- 开头的
%字符。
- 开头的
- (可选) 赋值抑制字符
*。如果存在此选项,函数不会将转换结果赋给任何接收参数。
- (可选) 赋值抑制字符
- (可选) 指定 最大字段宽度 的整数(大于零),即允许函数在当前转换说明指定的转换中消耗的最大字符数。请注意,如果不提供宽度,
%s和%[可能导致缓冲区溢出。
- (可选) 指定 最大字段宽度 的整数(大于零),即允许函数在当前转换说明指定的转换中消耗的最大字符数。请注意,如果不提供宽度,
- (可选) 长度修饰符,指定接收参数的大小,即实际的目标类型。这会影响转换精度和溢出规则。每种转换类型的默认目标类型不同(见下表)。
- 转换格式说明符。
可用的格式说明符如下:
| 转换 说明符 |
说明 | 预期 的参数类型 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 长度修饰符→ | hh
|
h
|
无 | l
|
ll
|
j
|
z
|
t
|
L
| |
| 自 C99 起才可用→ | 是 | 是 | 是 | 是 | 是 | |||||
%
|
匹配字面量
%。 |
不适用 | 不适用 | 不适用 | 不适用 | 不适用 | 不适用 | 不适用 | 不适用 | 不适用 |
c
|
匹配一个字符或一系列字符。
|
不适用 | 不适用 | char* |
wchar_t* |
不适用 | 不适用 | 不适用 | 不适用 | 不适用 |
s
|
匹配一系列非空白字符(一个字符串)。
| |||||||||
[集合 ]
|
匹配来自 集合 中的非空字符序列。
| |||||||||
d
|
匹配一个十进制整数。
|
signed char* 或 unsigned char* |
signed short* 或 unsigned short* |
signed int* 或 unsigned int* |
signed long* 或 unsigned long* |
signed long long* 或 unsigned long long* |
intmax_t* 或 uintmax_t* |
size_t* |
ptrdiff_t* |
不适用 |
b (C23)
|
匹配一个无符号二进制整数。
| |||||||||
i
|
匹配一个整数。
| |||||||||
u
|
匹配一个无符号十进制整数。
| |||||||||
o
|
匹配一个无符号八进制整数。
| |||||||||
xX
|
匹配一个无符号十六进制整数。
| |||||||||
n
|
返回迄今为止读取的字符数。
| |||||||||
a (C99)A (C99)eEfF (C99)gG
|
匹配一个浮点数。
|
不适用 | 不适用 | float* |
double* |
不适用 | 不适用 | 不适用 | 不适用 | long double* |
p
|
匹配实现定义的字符序列,定义一个指针。
|
不适用 | 不适用 | void** |
不适用 | 不适用 | 不适用 | 不适用 | 不适用 | 不适用 |
| 注意 | ||||||||||
|
对于除 除 除 如果未使用长度说明符 转换说明符 用于定宽整数类型(int8_t 等)的正确转换说明在头文件 <inttypes.h> 中定义(尽管 SCNdMAX、SCNuMAX 等与 每个转换说明符的动作之后有一个序列点;这允许将多个字段存储到同一个“接收器”变量中。 当解析一个不完整的浮点值,该值以指数结束但没有数字时,例如使用转换说明符 如果转换说明无效,则行为未定义。 | ||||||||||
返回值
示例
#include <stdio.h>
#include <string.h>
#include <wchar.h>
#define NUM_VARS 3
#define ERR_READ 2
#define ERR_WRITE 3
int main(void)
{
wchar_t state[64];
wchar_t capital[64];
unsigned int population = 0;
int elevation = 0;
int age = 0;
float pi = 0;
#if INTERACTIVE_MODE
wprintf(L"Enter state, age, and pi value: ");
if (wscanf(L"%ls%d%f", state, &age, &pi) != NUM_VARS)
{
fprintf(stderr, "Error reading input.\n");
return ERR_READ;
}
#else
wchar_t* input = L"California 170 3.141592";
if (swscanf(input, L"%ls%d%f", state, &age, &pi) != NUM_VARS)
{
fprintf(stderr, "Error reading input.\n");
return ERR_READ;
}
#endif
wprintf(L"State: %ls\nAge : %d years\nPi : %.5f\n\n", state, age, pi);
FILE* fp = tmpfile();
if (fp)
{
// write some data to temp file
if (!fwprintf(fp, L"Mississippi Jackson 420000 807"))
{
fprintf(stderr, "Error writing to file.\n");
fclose(fp);
return ERR_WRITE;
}
// rewind file pointer
rewind(fp);
// read data into variables
fwscanf(fp, L"%ls%ls%u%d", state, capital, &population, &elevation);
wprintf(L"State : %ls\nCapital: %ls\nJackson population (in 2020): %u\n"
L"Highest elevation: %dft\n",
state, capital, population, elevation);
fclose(fp);
}
}
可能的输出:
State: California
Age : 170 years
Pi : 3.14159
State : Mississippi
Capital: Jackson
Jackson population (in 2020): 420000
Highest elevation: 807ft
参考
- C23 标准(ISO/IEC 9899:2024):
- 7.29.2.2 fwscanf 函数(页:待定)
- 7.29.2.4 swscanf 函数(页:待定)
- 7.29.2.12 wscanf 函数(页:待定)
- K.3.9.1.2 fwscanf_s 函数(页:待定)
- K.3.9.1.5 swscanf_s 函数(页:待定)
- K.3.9.1.14 wscanf_s 函数(页:待定)
- C17 标准(ISO/IEC 9899:2018):
- 7.29.2.2 fwscanf 函数(页:待定)
- 7.29.2.4 swscanf 函数(页:待定)
- 7.29.2.12 wscanf 函数(页:待定)
- K.3.9.1.2 fwscanf_s 函数(页:待定)
- K.3.9.1.5 swscanf_s 函数(页:待定)
- K.3.9.1.14 wscanf_s 函数(页:待定)
- C11 标准(ISO/IEC 9899:2011):
- 7.29.2.2 fwscanf 函数(页:410-416)
- 7.29.2.4 swscanf 函数(页:417)
- 7.29.2.12 wscanf 函数(页:421)
- K.3.9.1.2 fwscanf_s 函数(页:628-629)
- K.3.9.1.5 swscanf_s 函数(页:631)
- K.3.9.1.14 wscanf_s 函数(页:638)
- C99 标准(ISO/IEC 9899:1999):
- 7.24.2.2 fwscanf 函数(页:356-362)
- 7.24.2.4 swscanf 函数(页:362)
- 7.24.2.12 wscanf 函数(页:366-367)
参阅
(C99)(C99)(C99)(C11)(C11)(C11) |
从stdin、文件流 或缓冲区读取格式化宽字符输入,并使用可变参数列表 (函数) |
C++ 文档关于wscanf、fwscanf、swscanf
| |