Namespaces
Variants

vwscanf, vfwscanf, vswscanf, vwscanf_s, vfwscanf_s, vswscanf_s

Из ru.cppreference.net
< c | io
 
 
Файловый ввод/вывод
Типы и объекты
        
Функции
Доступ к файлам
(C95)
Неформатированный ввод/вывод
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

Форматированный ввод
Прямой ввод/вывод
Форматированный вывод
Позиционирование в файле
Обработка ошибок
Операции с файлами
 
Определено в заголовке <wchar.h>
int vwscanf( const wchar_t *restrict format, va_list vlist );
(1) (начиная с C99)
int vfwscanf( FILE *restrict stream,
              const wchar_t *restrict format, va_list vlist );
(2) (начиная с C99)
int vswscanf( const wchar_t *restrict buffer,
              const wchar_t *restrict format, va_list vlist );
(3) (начиная с C99)
int vwscanf_s( const wchar_t *restrict format, va_list vlist );
(4) (начиная с C11)
int vfwscanf_s( FILE *restrict stream,
                const wchar_t *restrict format, va_list vlist );
(5) (начиная с C11)
int vswscanf_s( const wchar_t *restrict buffer,
                const wchar_t *restrict format, va_list vlist );
(6) (начиная с C11)

Читает данные из различных источников, интерпретирует их в соответствии с format и сохраняет результаты в места, определённые через vlist.

1) Читает данные из stdin.
2) Читает данные из файлового потока stream.
3) Читает данные из нуль-терминированной широкой строки buffer. Достижение конца строки эквивалентно достижению условия конца файла для fwscanf
4-6) Аналогично (1-3), за исключением того, что спецификаторы преобразования %c, %s и %[ ожидают по два аргумента (обычный указатель и значение типа rsize_t, указывающее размер принимающего массива, которое может быть равно 1 при чтении с %lc в одиночный широкий символ), а также следующих ошибок, обнаруживаемых во время выполнения и вызывающих установленную в данный момент функцию обработчика ограничений:
  • любой из аргументов указательного типа является нулевым указателем
  • format, stream или buffer является нулевым указателем
  • количество символов, которое было бы записано с помощью %c, %s или %[, плюс завершающий нуль-символ, превысило бы второй аргумент (rsize_t), предоставленный для каждого из этих спецификаторов преобразования
  • дополнительно, любая другая обнаруживаемая ошибка, например, неизвестный спецификатор преобразования
Как и все функции с проверкой границ, vwscanf_s, vfwscanf_s и vswscanf_s гарантированно доступны только в том случае, если __STDC_LIB_EXT1__ определена реализацией и если пользователь определяет __STDC_WANT_LIB_EXT1__ как целочисленную константу 1 перед включением <stdio.h>.

Параметры

stream - входной файловый поток для чтения
buffer - указатель на нуль-терминированную широкую строку для чтения
format - указатель на нуль-терминированную широкую строку, задающую способ чтения ввода
vlist - список аргументов переменной длины, содержащий принимающие аргументы.


Строка format состоит из

  • непробельных широких символов, кроме %: каждый такой символ в строке формата потребляет ровно один идентичный символ из входного потока или вызывает сбой функции, если следующий символ в потоке не равен ему.
  • пробельных символов: любой одиночный пробельный символ в строке формата потребляет все доступные последовательные пробельные символы из ввода (определяется как при вызове iswspace в цикле). Обратите внимание, что нет различия между "\n", " ", "\t\t" или другими пробельными символами в строке формата.
  • спецификаций преобразования. Каждая спецификация преобразования имеет следующий формат:
  • вводный символ %.
  • (необязательно) символ подавления присваивания *. Если эта опция присутствует, функция не присваивает результат преобразования никакому принимающему аргументу.
  • (необязательно) целое число (больше нуля), которое задаёт максимальную ширину поля, то есть максимальное количество символов, которое функция может потребить при выполнении преобразования, указанного текущей спецификацией преобразования. Обратите внимание, что %s и %[ могут привести к переполнению буфера, если ширина не указана.
  • (необязательно) модификатор длины, который задаёт размер принимающего аргумента, то есть фактический тип назначения. Это влияет на точность преобразования и правила переполнения. Тип назначения по умолчанию различается для каждого типа преобразования (см. таблицу ниже).
  • спецификатор формата преобразования.

Доступны следующие спецификаторы формата:

Спецификатор
преобразования
Пояснение Ожидаемый
Тип аргумента
Модификатор длины→ hh h нет l ll j z t L
Доступно только начиная с C99→ Да Да Да Да Да
%
Соответствует литералу %.
Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д
c

Соответствует символу или последовательности символов.

  • Если используется спецификатор ширины, соответствует ровно width широких символов (аргумент должен быть указателем на массив достаточного размера).
  • В отличие от %s и %[, не добавляет нуль-символ в конец массива.
Н/Д Н/Д
char*
wchar_t*
Н/Д Н/Д Н/Д Н/Д Н/Д
s

Соответствует последовательности непробельных символов (строке).

  • Если используется спецификатор ширины, соответствует не более width символов или до первого пробельного символа, в зависимости от того, что встретится раньше.
  • Всегда сохраняет нуль-символ в дополнение к сопоставленным символам (поэтому массив аргумента должен иметь место по крайней мере для width+1 символов).
[набор ]

Соответствует непустой последовательности символов из набора символов.

  • Если первым символом набора является ^, то сопоставляются все символы, не входящие в набор.
  • Если набор начинается с ] или ^], то символ ] также включается в набор.
  • Определено реализацией, может ли символ - в не начальной позиции в наборе сканирования обозначать диапазон, как в [0-9].
  • Если используется спецификатор ширины, соответствует не более width.
  • Всегда сохраняет нуль-символ в дополнение к сопоставленным символам (поэтому массив аргумента должен иметь место по крайней мере для width+1 символов).
d

Соответствует десятичному целому числу.

  • Формат числа такой же, как ожидается функцией wcstol со значением 10 для аргумента base.
signed char* или unsigned char*
signed short* или unsigned short*
signed int* или unsigned int*
signed long* или unsigned long*
signed long long* или unsigned long long*
intmax_t* или uintmax_t*
size_t*
ptrdiff_t*
Н/Д
b (C23)

Соответствует беззнаковому двоичному целому числу.

  • Формат числа такой же, как ожидается функцией wcstoul со значением 2 для аргумента base.
i

Соответствует целому числу.

  • Формат числа такой же, как ожидается функцией wcstol со значением 0 для аргумента base (основание определяется по первым разобранным символам).
u

Соответствует беззнаковому десятичному целому числу.

  • Формат числа такой же, как ожидается функцией wcstoul со значением 10 для аргумента base.
o

Соответствует беззнаковому восьмеричному целому числу.

  • Формат числа такой же, как ожидается функцией wcstoul со значением 8 для аргумента base.
x
X

Соответствует беззнаковому шестнадцатеричному целому числу.

  • Формат числа такой же, как ожидается функцией wcstoul со значением 16 для аргумента base.
n

Возвращает количество прочитанных до сих пор символов.

  • Ввод не потребляется. Не увеличивает счётчик присваиваний.
  • Если для спецификатора определён оператор подавления присваивания, поведение не определено.
a (C99)
A (C99)
e
E
f
F (C99)
g
G

Соответствует числу с плавающей точкой.

  • Формат числа такой же, как ожидается функцией wcstof.
Н/Д Н/Д
float*
double*
Н/Д Н/Д Н/Д Н/Д
long double*
p

Соответствует последовательности символов, определяемой реализацией, задающей указатель.

  • printfФункции семейства %p должны создавать ту же последовательность с использованием спецификатора формата
. Н/Д
void**
Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д
Примечания

Для каждого спецификатора преобразования, кроме n, из потока потребляется самая длинная последовательность входных символов, которая не превышает заданную ширину поля и которая либо точно соответствует тому, что ожидает спецификатор преобразования, либо является префиксом последовательности, которую он бы ожидал. Первый символ, если он есть, после этой потреблённой последовательности остаётся непрочитанным. Если потреблённая последовательность имеет нулевую длину или если потреблённая последовательность не может быть преобразована так, как указано выше, возникает ошибка соответствия, если только конец файла, ошибка кодирования или ошибка чтения не препятствовали вводу из потока, в этом случае это ошибка ввода.

За исключением спецификатора %, элемент ввода (или, для %n, количество входных символов) сначала преобразуется в тип, подходящий для спецификатора преобразования. Если присваивание не было подавлено с помощью *, результат преобразования записывается в объект, на который указывает следующий аргумент, в который ещё не было записи. Если этот объект не имеет подходящего типа или если результат преобразования не может быть представлен в объекте, поведение не определено.

Все спецификаторы преобразования, кроме [, c и n, потребляют и отбрасывают все ведущие пробельные символы (определяется как при вызове iswspace) перед попыткой разбора ввода. Эти потреблённые символы не засчитываются в указанную максимальную ширину поля.

Если спецификатор длины l не используется, спецификаторы преобразования c, s и [ выполняют преобразование широкого символа в многобайтовый, как при вызове wcrtomb с объектом mbstate_t, инициализированным нулём перед преобразованием первого символа.

Спецификаторы преобразования s и [ всегда сохраняют нулевой терминатор в дополнение к сопоставленным символам. Размер массива назначения должен быть как минимум на единицу больше указанной ширины поля. Использование %s или %[ без указания размера массива назначения так же небезопасно, как gets.

Правильные спецификации преобразования для целочисленных типов фиксированной ширины (int8_t и т.д.) определены в заголовке <inttypes.h> (хотя SCNdMAX, SCNuMAX и т.д. являются синонимами %jd, %ju и т.д.).

Существует точка последовательности после действия каждого спецификатора преобразования; это позволяет хранить несколько полей в одной и той же «принимающей» переменной.

При разборе неполного значения с плавающей точкой, которое заканчивается показателем степени без цифр, например, при разборе "100er" со спецификатором преобразования %f, последовательность "100e" (самый длинный префикс потенциально допустимого числа с плавающей точкой) потребляется, что приводит к ошибке соответствия (потреблённая последовательность не может быть преобразована в число с плавающей точкой), при этом "r" остаётся. Некоторые существующие реализации не следуют этому правилу и откатываются, чтобы потреблять только "100", оставляя "er", например, ошибка glibc 1765.

Если спецификация преобразования недопустима, поведение не определено.

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

1-3) Количество успешно присвоенных принимающих аргументов или EOF, если ошибка чтения произошла до присвоения первого принимающего аргумента.
4-6) Аналогично (1-3), за исключением того, что EOF также возвращается при нарушении ограничений во время выполнения.

Примечания

Все эти функции могут вызывать va_arg, значение arg не определено после возврата. Эти функции не вызывают va_end, и это должно быть сделано вызывающей стороной.

Пример

Ссылки

  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.29.2.6 Функция vfwscanf (стр. 418)
  • 7.29.2.8 Функция vswscanf (стр. 419)
  • 7.29.2.10 Функция vwscanf (стр. 420)
  • K.3.9.1.7 Функция vfwscanf_s (стр. 632-633)
  • K.3.9.1.10 Функция vswscanf_s (стр. 635-636)
  • K.3.9.1.12 Функция vwscanf_s (стр. 637)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 7.24.2.6 Функция vfwscanf (стр. 364)
  • 7.24.2.8 Функция vswscanf (стр. 365)
  • 7.24.2.10 Функция vwscanf (стр. 366)

См. также

читает форматированный широкий символьный ввод из stdin, файлового потока или буфера
(функция)
Документация C++ для vwscanf, vfwscanf, vswscanf