Поделиться через


sscanf_s, , _sscanf_s_lswscanf_s_swscanf_s_l

Считывают форматированные данные из строки. Эти версии , _swscanf_l_sscanf_lswscanf имеют улучшения безопасности, как описано в функциях sscanfбезопасности в CRT.

Синтаксис

int sscanf_s(
   const char *buffer,
   const char *format [,
   argument ] ...
);
int _sscanf_s_l(
   const char *buffer,
   const char *format,
   _locale_t locale [,
   argument ] ...
);
int swscanf_s(
   const wchar_t *buffer,
   const wchar_t *format [,
   argument ] ...
);
int _swscanf_s_l(
   const wchar_t *buffer,
   const wchar_t *format,
   _locale_t locale [,
   argument ] ...
);

Параметры

buffer
Сохраненные данные

format
Строка управления форматом. Дополнительные сведения см. в полях спецификации форматирования: scanf и wscanf функций.

argument
Необязательные аргументы

locale
Используемый языковой стандарт

Возвращаемое значение

Каждая из этих функций возвращает количество полей, которые успешно преобразованы и назначены. Возвращаемое значение не включает поля, которые были прочитаны, но не назначены. Возвращаемое значение 0 указывает, что поля не были назначены. Если до первого преобразования возникает ошибка или достигается конец строки, возвращается значение EOF.

Если buffer или format является NULL указателем, вызывается обработчик недопустимых параметров, как описано в разделе проверки параметров. Если разрешается продолжать выполнение, эти функции возвращают -1 и присваивают errno значение EINVAL.

Сведения об этих и других кодах ошибок см. в разделе errno, _doserrno_sys_errlistи _sys_nerr.

Замечания

Функция sscanf_s считывает данные из buffer в расположение, заданное параметрами argument. Аргументы, следующие за строкой формата, задают указатели на переменные, имеющие тип, соответствующий спецификатору типа в format. В отличие от менее безопасной версии sscanf требуется параметр размера буфера при использовании символов полей типа c, C, s, S или наборов элементов управления строк, заключенных в []. Размер буфера в символах должен быть предоставлен как дополнительный параметр сразу после каждого параметра буфера, требующего его. Например, если вы читаете строку, размер буфера для этой строки передается следующим образом:

wchar_t ws[10];
swscanf_s(in_str, L"%9s", ws, (unsigned)_countof(ws)); // buffer size is 10, width specification is 9

Размер буфера включает завершающее значение NULL. Можно использовать поле спецификации ширины, чтобы гарантировать, что считываемый токен поместится в буфер. Если поле спецификации ширины не используется, а чтение маркера слишком велико для размещения в буфере, ничего не записывается в этот буфер.

Один символ может быть считан следующим образом:

wchar_t wc;
swscanf_s(in_str, L"%c", &wc, 1);

В этом примере считывается один символ из входной строки и затем сохраняется в буфер расширенных символов. При чтении нескольких символов для строк, которые не завершаются нуль-символом, целые числа без знака используются как спецификация ширины и размер буфера.

char c[4];
sscanf_s(input, "%4c", &c, (unsigned)_countof(c)); // not null terminated

Дополнительные сведения см. в разделе scanf_s, wscanf_s_wscanf_s_l _scanf_s_lи scanf символы полей типа.

Примечание.

Параметр размера имеет тип unsigned, а не size_t. При компиляции для 64-разрядных целевых объектов следует использовать static_cast для преобразования результатов _countof или sizeof до требуемых размеров.

Аргумент format определяет интерпретацию полей входных данных и имеет такую же форму и функцию, как аргумент format для функции scanf_s. Если копирование производится между перекрывающимися строками, поведение не определено.

swscanf_s — это двухбайтовая версия sscanf_s; аргументы для swscanf_s представляют собой двухбайтовые строки. sscanf_s не обрабатывает шестнадцатеричные шестнадцатеричные символы. swscanf_s не обрабатывает шестнадцатеричные или шестнадцатеричные символы зоны совместимости Юникода. В противном случае поведение swscanf_s и sscanf_s идентично.

Версии этих функций с суффиксом _l идентичны версиям без суффикса, за исключением того, что они используют переданный параметр языкового стандарта вместо языкового стандарта текущего потока.

Сопоставления подпрограмм универсального текста

TCHAR.H рутина _UNICODE и _MBCS не определен _MBCS Определенные _UNICODE Определенные
_stscanf_s sscanf_s sscanf_s swscanf_s
_stscanf_s_l _sscanf_s_l _sscanf_s_l _swscanf_s_l

Требования

Маршрут Обязательный заголовок
sscanf_s, _sscanf_s_l <stdio.h>
swscanf_s, _swscanf_s_l <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Совместимость.

Пример

// crt_sscanf_s.c
// This program uses sscanf_s to read data items
// from a string named tokenstring, then displays them.

#include <stdio.h>
#include <stdlib.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 plus null terminator
   sscanf_s( tokenstring, "%s", s, (unsigned)_countof(s) );
   sscanf_s( tokenstring, "%c", &c, (unsigned)sizeof(char) );
   sscanf_s( tokenstring, "%d", &i );
   sscanf_s( tokenstring, "%f", &fp );

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

См. также

Потоковый ввод-вывод
fscanf, , _fscanf_lfwscanf_fwscanf_l
scanf, , _scanf_lwscanf_wscanf_l
sprintf, , _sprintf_lswprintf, _swprintf_l__swprintf_l
snprintf, , _snprintf_snprintf_l, _snwprintf_snwprintf_l