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


vsscanf_s, vswscanf_s

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

Синтаксис

int vsscanf_s(
   const char *buffer,
   const char *format,
   va_list argptr
);
int vswscanf_s(
   const wchar_t *buffer,
   const wchar_t *format,
   va_list arglist
);

Параметры

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

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

arglist
Список аргументов переменных.

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

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

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

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

Замечания

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

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

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

Примечание.

Параметр размера имеет тип unsigned, а не size_t.

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

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

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

Подпрограмма TCHAR.H _UNICODE и _MBCS не определен _MBCS Определенные _UNICODE Определенные
_vstscanf_s vsscanf_s vsscanf_s vswscanf_s

Требования

Маршрут Обязательный заголовок
vsscanf_s <stdio.h>
vswscanf_s <stdio.h> или <wchar.h>

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

Пример

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

#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>

int call_vsscanf_s(char *tokenstring, char *format, ...)
{
    int result;
    va_list arglist;
    va_start(arglist, format);
    result = vsscanf_s(tokenstring, format, arglist);
    va_end(arglist);
    return result;
}

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:
    call_vsscanf_s(tokenstring, "%80s", s, _countof(s));
    call_vsscanf_s(tokenstring, "%c", &c, sizeof(char));
    call_vsscanf_s(tokenstring, "%d", &i);
    call_vsscanf_s(tokenstring, "%f", &fp);

    // 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

См. также

Потоковый ввод-вывод
scanf, , _scanf_lwscanf_wscanf_l
sscanf, , _sscanf_lswscanf_swscanf_l
sscanf_s, , _sscanf_s_lswscanf_s_swscanf_s_l
sprintf, , _sprintf_lswprintf, _swprintf_l__swprintf_l
vsscanf, vswscanf