读取标准输入流中的格式化数据。 这些版本的 vscanf、vwscanf 具有安全性增强功能,如 CRT 中的安全功能中所述。
语法
int vscanf_s(
   const char *format,
   va_list arglist
);
int vwscanf_s(
   const wchar_t *format,
   va_list arglist
);
参数
format
格式控制字符串。
arglist
变量参数列表。
返回值
返回已成功转换和分配的字段数量;返回值不包括已读取但未分配的字段。 返回值为 0 表示没有分配任何字段。 出现错误时,或者如果第一次尝试读取字符时遇到文件末尾字符或字符串末尾字符,则返回值为 EOF。 如果 format 是 NULL 指针,则调用无效参数处理程序,如参数验证中所述。 如果允许继续执行,则 vscanf_s 和 vwscanf_s 返回 EOF,并将 errno 设置为 EINVAL。
有关这些和其他错误代码的信息,请参阅 、errno、_doserrno、_sys_errlist 和 _sys_nerr。
备注
vscanf_s 函数从标准输入流 stdin 中读取数据,并将数据写入到 arglist 参数列表给定的位置。 列表中的每个参数都必须为指向类型的变量的指针,该类型与 format 中的类型说明符对应。 如果在重叠的字符串之间发生复制,则此行为不确定。
vwscanf_s 是 vscanf_s的宽字符版本; format 的 vwscanf_s 参数是宽字符字符串。 如果在 ANSI 模式下打开流,则 vwscanf_s 和 vscanf_s 的行为相同。 vscanf_s 不支持 UNICODE 流的输入。
与 vscanf 和 vwscanf 不同,vscanf_s 和 vwscanf_s 要求为类型 c、C、s、S 的所有输入参数或包含在 [] 内的字符串控件集指定缓冲区大小。 以字符为单位的缓冲区大小作为另一个参数,紧跟在指针后面传递到缓冲区或变量。 wchar_t 字符串以字符为单位的缓冲区大小与以字节为单位的大小不同。
缓冲区大小包括终止 null 字符。 可以使用宽度规范字段来确保读入的标记可放入缓冲区中。 如果未使用任何宽度规范字段,并且读取的标记太大以致缓冲区中无法容纳,则不会向该缓冲区写入任何内容。
注意
size 参数的类型为 unsigned,而不是 size_t。
有关详细信息,请参阅 scanf 宽度规范。
一般文本例程映射
| TCHAR.H 例程 | _UNICODE和_MBCS未定义 | _MBCS已定义 | _UNICODE已定义 | 
|---|---|---|---|
| _vtscanf_s | vscanf_s | vscanf_s | vwscanf_s | 
有关详细信息,请参阅格式规范字段:scanf 和 wscanf 函数。
要求
| 例程 | 必需的标头 | 
|---|---|
| vscanf_s | <stdio.h> | 
| wscanf_s | <stdio.h> 或 <wchar.h> | 
通用 Windows 平台 (UWP) 应用中不支持控制台。 与控制台、stdin、stdout 和 stderr 关联的标准流句柄必须重定向,然后 C 运行时函数才能在 UWP 应用中使用它们。 有关兼容性的详细信息,请参阅 兼容性。
示例
// crt_vscanf_s.c
// compile with: /W3
// This program uses the vscanf_s and vwscanf_s functions
// to read formatted input.
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
int call_vscanf_s(char *format, ...)
{
    int result;
    va_list arglist;
    va_start(arglist, format);
    result = vscanf_s(format, arglist);
    va_end(arglist);
    return result;
}
int call_vwscanf_s(wchar_t *format, ...)
{
    int result;
    va_list arglist;
    va_start(arglist, format);
    result = vwscanf_s(format, arglist);
    va_end(arglist);
    return result;
}
int main( void )
{
    int   i, result;
    float fp;
    char  c, s[81];
    wchar_t wc, ws[81];
    result = call_vscanf_s("%d %f %c %C %s %S", &i, &fp, &c, 1,
                           &wc, 1, s, _countof(s), ws, _countof(ws) );
    printf( "The number of fields input is %d\n", result );
    printf( "The contents are: %d %f %c %C %s %S\n", i, fp, c, wc, s, ws);
    result = call_vwscanf_s(L"%d %f %hc %lc %S %ls", &i, &fp, &c, 2,
                            &wc, 1, s, _countof(s), ws, _countof(ws) );
    wprintf( L"The number of fields input is %d\n", result );
    wprintf( L"The contents are: %d %f %C %c %hs %s\n", i, fp, c, wc, s, ws);
}
当向示例中的此程序提供输入时,将会有以下输出:
71 98.6 h z Byte characters
36 92.3 y n Wide characters
The number of fields input is 6
The contents are: 71 98.599998 h z Byte characters
The number of fields input is 6
The contents are: 36 92.300003 y n Wide characters