Namespaces
Variants

std:: vwscanf, std:: vfwscanf, std:: vswscanf

From ru.cppreference.net
< cpp ‎ | io ‎ | c
Определено в заголовочном файле <cwchar>
int vwscanf ( const wchar_t * format, std :: va_list vlist ) ;
(1) (начиная с C++11)
int vfwscanf ( std:: FILE * stream, const wchar_t * format, std :: va_list vlist ) ;
(2) (начиная с C++11)
int vswscanf ( const wchar_t * buffer, const wchar_t * format, std :: va_list vlist ) ;
(3) (начиная с C++11)

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

1) Считывает данные из stdin .
2) Считывает данные из файлового потока stream .
3) Считывает данные из широкой строки с нулевым завершением buffer .

Содержание

Параметры

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


Строка формата состоит из

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

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

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

Н/ДСоответствует символу или последовательности символов

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

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

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

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

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

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

  • Формат числа такой же, как ожидается std::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*
std::intmax_t* или std::uintmax_t*
std::size_t*
std::ptrdiff_t*
Н/Д
b (C++26)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Количество аргументов, успешно прочитанных, или EOF в случае возникновения ошибки.

Пример

Смотрите также

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