scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l

从标准输入流读取设置数据格式。这些是 scanf, _scanf_l, wscanf, _wscanf_l 的版本与安全增强如 CRT中的安全功能所述。

int scanf_s(
   const char *format [,
   argument]... 
);
int _scanf_s_l(
   const char *format,
   locale_t locale [,
   argument]... 
);
int wscanf_s(
   const wchar_t *format [,
   argument]... 
);
int _wscanf_s_l(
   const wchar_t *format,
   locale_t locale [,
   argument]... 
);

参数

  • format
    窗体控件字符串。

  • argument
    可选参数。

  • locale
    使用的区域设置。

返回值

返回成功转换和分配的字段数;返回值不包括读取,但未赋值的字段。返回值为 0 表示字段未分配。返回值是错误的 EOF,或者文件结尾字符或结束字符字符串的字符在第一次尝试遇到读取字符。如果 format 是 NULL 指针,无效参数调用处理程序,如 参数验证所述。如果执行允许继续,scanf_s 和 wscanf_s 返回 EOF 并将 errno 到 EINVAL。

有关这些属性和其他错误代码的信息,请参见 _doserrno、errno、_sys_errlist 和_sys_nerr

备注

scanf_s函数读取标准输入流 stdin并将数据添加到 argument出自的位置。每 argument 必须是指向对应于 format的类型说明符类型的变量。如果复制出现在重叠的字符串之间,该行为不确定。

wscanf_s是 scanf_s的宽字符版本;为 wscanf_s的 format 参数是宽字符字符串。如果流在 ANSI 模式下,中打开wscanf_s和 scanf_s同样具有相同的行为。scanf_s 当前不支持从 UNICODE 流的输入。

这些功能的版本与 _l 后缀的相同,只不过它们使用区域设置参数而不是当前线程区域设置。

不同 scanf和 wscanf,scanf_s和 wscanf_s需要缓冲区区域大小指定类型 c、C、s、S或 [的任何输入参数。在字符的缓冲区区域大小将作为 in 指针后的其他参数传递给缓冲区或变量。例如,因此,如果读取字符串,该字符串的缓冲区区域大小通过如下所示:

char s[10];

scanf_s("%9s", s, _countof(s)); // buffer size is 10, width specification is 9

缓冲区大小区域包括终止 null。宽度规范字段可用于确保编写的标记将放入缓冲区。如果未使用宽度规范字段,并且,读取的标记太大而无法适合缓冲区,则到该缓冲区不会写入。

说明说明

大小参数是类型 unsigned,而不是 size_t。

下面的示例演示,缓冲区区域大小参数描述的最大字符数,而不是字节。在对 wscanf_s的调用,由缓冲区类型表示的字符宽度不匹配由格式说明符表示的字符宽度。

wchar_t ws[10];
wscanf_s("%9S", ws, _countof(ws));

S 格式说明符指示是“中的”默认值宽度属性函数支持的使用字符宽度。字符宽度是单字节,但是,该功能支持双字节字符。此示例在双字节字符缓冲区写入 9 个单字节字符字符串并将它们。字符将单字节值;最后两个字符在 ws[0]在 ws[1]存储,第二两个存储,等等。

对于字符,一个人都可以读取单个字符如下所示:

char c;

scanf_s("%c", &c, 1);

在读取非 null 终止的字符串时多个字符,整数用作宽度规范和区域缓冲区大小。

char c[4];

scanf_s("%4c", &c, _countof(c)); // not null terminated

有关更多信息,请参见scanf宽度规范

一般文本例程映射

TCHAR.H 实例

未定义的_UNICODE & _MBCS

定义的_MBCS

定义的_UNICODE

_tscanf_s

scanf_s

scanf_s

wscanf_s

_tscanf_s_l

_scanf_s_l

_scanf_s_l

_wscanf_s_l

有关更多信息,请参见 格式规范字段— scanf 功能和 wscanf 功能

要求

实例

必需的标头

scanf_s, _scanf_s_l

<stdio.h>

wscanf_s, _wscanf_s_l

<stdio.h> 或 <wchar.h>

控件个在 Windows 应用商店 apps 不受支持。标准流处理与控件个,stdin,stdout和 stderr,在 C 运行时函数在 Windows 应用商店 apps 之前,可以使用它们必须重定向。有关其他的兼容性信息,请参见中介绍的 兼容性

示例

// crt_scanf_s.c
// This program uses the scanf_s and wscanf_s functions
// to read formatted input.
  
#include <stdio.h>
#include <stdlib.h>

int main( void )
{
   int      i,
            result;
   float    fp;
   char     c,
            s[80];
   wchar_t  wc,
            ws[80];

   result = scanf_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 = wscanf_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);
}
  

.NET Framework 等效项

请参见

参考

浮点支持

流I/O

区域设置

fscanf, _fscanf_l, fwscanf, _fwscanf_l

printf, _printf_l, wprintf, _wprintf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

sscanf, _sscanf_l, swscanf, _swscanf_l