sscanf_s
, , _sscanf_s_l
swscanf_s
_swscanf_s_l
Считывают форматированные данные из строки. Эти версии , _swscanf_l
_sscanf_l
swscanf
имеют улучшения безопасности, как описано в функциях 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_l
fwscanf
_fwscanf_l
scanf
, , _scanf_l
wscanf
_wscanf_l
sprintf
, , _sprintf_l
swprintf
, _swprintf_l
__swprintf_l
snprintf
, , _snprintf
_snprintf_l
, _snwprintf
_snwprintf_l