Spec-Zone.ru › C++

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

Определено в заголовочном файле <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.

Параметры

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


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

  • не являющихся пробельными широких символов, кроме %: каждый такой символ в строке формата считывает из входного потока ровно один идентичный символ или приводит к ошибке функции, если следующий символ в потоке не совпадает с ним.
  • пробельных символов: любой одиночный пробельный символ в строке формата считывает из входных данных все доступные подряд идущие пробельные символы (определяется так, как если бы в цикле вызывалась 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 символов).
[set ]

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

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

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

  • Формат числа совпадает с форматом, ожидаемым функцией std::wcstol при значении 10 аргумента base.
signedchar* or unsignedchar*
signedshort* or unsignedshort*
signedint* or unsignedint*
signedlong* or unsignedlong*
signedlonglong* or unsignedlonglong*
std::intmax_t* or 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*
Н/П Н/П Н/П Н/П
longdouble*
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 1765.

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

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

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

Пример

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/c/vfwscanf

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API