Namespaces
Variants

std:: wscanf, std:: fwscanf, std:: swscanf

From ru.cppreference.net
< cpp ‎ | io ‎ | c
Определено в заголовочном файле <cwchar>
int wscanf ( const wchar_t * format, ... ) ;
(1)
int fwscanf ( std:: FILE * stream, const wchar_t * format, ... ) ;
(2)
int swscanf ( const wchar_t * buffer, const wchar_t * format, ... ) ;
(3)

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

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

Содержание

Параметры

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


Строка 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 символов).
[набор ]

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

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

Пример

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

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