_cscanf_s, _cscanf_s_l, _cwscanf_s, _cwscanf_s_l

从控制台读取格式数据。 这些更安全版本的 _cscanf_cscanf_l_cwscanf_cwscanf_l 具有安全增强功能,如 CRT 中的安全功能中所述。

重要

此 API 不能用于在 Windows 运行时中执行的应用程序。 有关详细信息,请参阅通用 Windows 平台应用中不支持的 CRT 函数

语法

int _cscanf_s(
   const char *format [,
   argument] ...
);
int _cscanf_s_l(
   const char *format,
   _locale_t locale [,
   argument] ...
);
int _cwscanf_s(
   const wchar_t *format [,
   argument] ...
);
int _cwscanf_s_l(
   const wchar_t *format,
   _locale_t locale [,
   argument] ...
);

参数

format
窗体控件字符串。

argument
可选参数。

locale
要使用的区域设置。

返回值

已成功转换和分配的字段数。 返回值不包括已读取但未分配的字段。 返回值为尝试在文件结尾读取的 EOF。 在操作系统命令行级别重定向键盘输入时,也可能返回 EOF。 返回值为零表示没有分配任何字段。

这些函数验证其参数。 如果 format 为空指针,则这些函数将调用无效的参数处理程序,如参数验证中所述。 如果允许执行继续,则这些函数将返回 EOF 并将 errno 设置为 EINVAL

备注

_cscanf_s 函数直接将数据从控制台读取到 argument 给定的位置。 _getche 函数用于读取字符。 每个可选参数都必须为指向类型的变量的指针,该类型与 format 中的类型说明符对应。 格式控制输入字段的解释,其形式和功能与 scanf_s 函数的 format 参数相同。 虽然 _cscanf_s 通常回显输入字符,但如果最后一次调用的是 _ungetch,则不会执行此操作。

scanf 系列中的其他安全版本的函数一样,_cscanf_s_cwscanf_s 要求提供 cCsS[ 类型字段字符的大小参数。 有关详细信息,请参阅 scanf 宽度规范

注意

大小参数的类型具有 unsigned,而不具有 size_t

这些带有 _l 后缀的函数的版本相同,只不过它们使用传递的区域设置参数而不是当前线程区域设置。

一般文本例程映射

TCHAR.H 例程 _UNICODE_MBCS 未定义 _MBCS 已定义 _UNICODE 已定义
_tcscanf_s _cscanf_s _cscanf_s _cwscanf_s
_tcscanf_s_l _cscanf_s_l _cscanf_s_l _cwscanf_s_l

要求

例程 必需的标头
_cscanf_s_cscanf_s_l <conio.h>
_cwscanf_s_cwscanf_s_l <conio.h> 或 <wchar.h>

有关兼容性的详细信息,请参阅 兼容性

C 运行时库的所有版本。

示例

// crt_cscanf_s.c
// compile with: /c
/* This program prompts for a string
* and uses _cscanf_s to read in the response.
* Then _cscanf_s returns the number of items
* matched, and the program displays that number.
*/

#include <stdio.h>
#include <conio.h>

int main( void )
{
   int result, n[3];
   int i;

   result = _cscanf_s( "%i %i %i", &n[0], &n[1], &n[2] );
   _cprintf_s( "\r\nYou entered " );
   for( i=0; i<result; i++ )
      _cprintf_s( "%i ", n[i] );
   _cprintf_s( "\r\n" );
}
1 2 3
You entered 1 2 3

另请参阅

控制台和端口 I/O
_cprintf_cprintf_l_cwprintf_cwprintf_l
fscanf_s_fscanf_s_lfwscanf_s_fwscanf_s_l
scanf_s_scanf_s_lwscanf_s_wscanf_s_l
sscanf_s_sscanf_s_lswscanf_s_swscanf_s_l