从字符串中读取格式化数据。 这些功能有更安全的版本可用;请参阅 sscanf_s_sscanf_s_lswscanf_s_swscanf_s_l

语法

int sscanf(
   const char *buffer,
   const char *format [,
   argument ] ...
);
int _sscanf_l(
   const char *buffer,
   const char *format,
   _locale_t locale [,
   argument ] ...
);
int swscanf(
   const wchar_t *buffer,
   const wchar_t *format [,
   argument ] ...
);
int _swscanf_l(
   const wchar_t *buffer,
   const wchar_t *format,
   _locale_t locale [,
   argument ] ...
);

参数

buffer
存储的数据

format
窗体控件字符串。 有关详细信息,请参阅格式规范语法

argument
可选自变量

locale
要使用的区域设置

返回值

每个函数都将返回成功转换并分配的字段数;返回值不包括已读取但未分配的字段。 返回值为 0 表示没有分配任何字段。 如果在首次转换前到达字符串的结尾,则返回值为 EOF 以指示错误。

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

有关这些错误代码和其他错误代码的信息,请参阅 errno_doserrno_sys_errlist_sys_nerr

备注

sscanf 函数将数据从 buffer 读入每个 argument 给定的位置。 每个 argument 必须为指向类型与 format 中的类型说明符对应的变量的指针。 format 参数控制输入字段的解释,并且格式和函数与 scanf 函数的 format 参数相同。 如果复制出现在重叠的字符串之间,则该行为不确定。

有关 scanf 类型字段字符的信息,请参阅 scanf 类型字段字符。 有关 scanf 格式规范字段的信息,请参阅格式规范字段

重要

在使用 sscanf 读取字符串时,请始终指定 %s 格式的宽度(例如,“%32s”而不是“%s”);否则,格式不正确的输入很容易导致缓冲区溢出

swscanfsscanf的宽字符版本; swscanf 的参数是宽字符串。 sscanf 不处理多字节十六进制字符。 swscanf 不处理 Unicode 全角十六进制或“兼容性区域”字符。 除此以外, swscanfsscanf 的行为完全相同。

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

一般文本例程映射

TCHAR.H 例程 _UNICODE_MBCS 未定义 _MBCS 已定义 _UNICODE 已定义
_stscanf sscanf sscanf swscanf
_stscanf_l _sscanf_l _sscanf_l _swscanf_l

要求

例程 必需的标头
%> <stdio.h>
%> <stdio.h><wchar.h>

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

示例

// crt_sscanf.c
// compile with: /W3
// This program uses sscanf to read data items
// from a string named tokenstring, then displays them.

#include <stdio.h>

int main( void )
{
   char  tokenstring[] = "15 12 14...";
   char  s[81];
   char  c;
   int   i;
   float fp;

   // Input various data from tokenstring:
   // max 80 character string:
   sscanf( tokenstring, "%80s", s ); // C4996
   sscanf( tokenstring, "%c", &c );  // C4996
   sscanf( tokenstring, "%d", &i );  // C4996
   sscanf( tokenstring, "%f", &fp ); // C4996
   // Note: sscanf is deprecated; consider using sscanf_s instead

   // Output the data read
   printf( "String    = %s\n", s );
   printf( "Character = %c\n", c );
   printf( "Integer:  = %d\n", i );
   printf( "Real:     = %f\n", fp );
}
String    = 15
Character = 1
Integer:  = 15
Real:     = 15.000000

另请参阅

流 I/O