std::wscanf, std::fwscanf, std::swscanf
Определено в заголовке <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 и сохраняет результаты в заданные места.
stdin. stream. buffer. Параметры
| stream | - | входной поток файла для чтения |
| buffer | - | указатель на строку с широкими символами с нулевым завершением для чтения |
| format | - | указатель на строку с широкими символами с нулевым завершением, определяющую способ чтения входных данных |
| ... | - | аргументы получения. |
Строка format состоит из
- неразрывных широких символов, кроме
%: каждый такой символ в строке format потребляет ровно один идентичный символ из входного потока или приводит к ошибке функции, если следующий символ в потоке не совпадает. - символов пробелов: любой одиночный пробельный символ в строке format потребляет все доступные последовательные пробельные символы из входного потока (определяются так же, как при вызове
iswspaceв цикле). Обратите внимание, что нет разницы между"\n"," ","\t\t", или другими пробелами в строке format. - спецификаторы преобразования. Каждый спецификатор преобразования имеет следующий формат:
- вводный
%символ. - (необязательно) символ подавления присваивания
*. Если этот параметр присутствует, функция не присваивает результат преобразования ни одному аргументу получения. - (необязательно) целое число (больше нуля), которое задаёт максимальную ширину поля, то есть максимальное количество символов, которое функция разрешается потреблять при выполнении преобразования, указанного текущим спецификатором преобразования. Обратите внимание, что
%sи%[могут привести к переполнению буфера, если ширина не указана. - (необязательно) модификатор длины, который указывает размер аргумента получения, то есть фактический тип назначения. Это влияет на точность преобразования и правила переполнения. Тип назначения по умолчанию отличается для каждого типа преобразования (см. таблицу ниже).
- спецификатор формата преобразования.
Доступны следующие спецификаторы формата:
| Спецификатор преобразования | Описание | Тип аргумента | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Модификатор длины → |
hh (C++11) |
h | (нет) |
l |
ll (C++11) |
j (C++11) |
z (C++11) |
t (C++11) |
L |
|
% | Сопоставляет литерал %. | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
c | Сопоставляет символ или последовательность символов. Если используется спецификатор ширины, сопоставляет ровно ширину широких символов (аргумент должен быть указателем на массив с достаточным пространством). В отличие от %s и %[, не добавляет нулевой символ в массив. | Н/Д | Н/Д |
char* |
wchar_t* | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
s | Сопоставляет последовательность неразрывных символов (строка). Если используется спецификатор ширины, сопоставляет до ширины или до первого пробельного символа, что наступит раньше. Всегда сохраняет нулевой символ в дополнение к сопоставленным символам (поэтому массив аргументов должен иметь место для как минимум ширина+1 символов). |
|||||||||
[множество] | Сопоставляет непустую последовательность символов из множества множество символов. Если первый символ множества равен |
|||||||||
d | Сопоставляет десятичное целое число. Формат числа такой же, как ожидается от |
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* | Н/Д |
i | Сопоставляет целое число. Формат числа такой же, как ожидается от |
|||||||||
u | Сопоставляет беспорядочное десятичное целое число. Формат числа такой же, как ожидается от |
|||||||||
o | Сопоставляет беспорядочное восьмеричное целое число. Формат числа такой же, как ожидается от |
|||||||||
x, X | Сопоставляет беспорядочное шестнадцатеричное целое число. Формат числа такой же, как ожидается от |
|||||||||
n | Возвращает количество прочитанных символов на данный момент. Ввод не потребляется. Счет присваивания не увеличивается. Если для спецификатора определён символ подавления присваивания, поведение неопределено. |
|||||||||
a, A(C++11)e, Ef, Fg, G | Сопоставляет число с плавающей точкой. Формат числа такой же, как ожидается от | Н/Д | Н/Д |
float* |
double* | Н/Д | Н/Д | Н/Д | Н/Д |
long double* |
p | Сопоставляет реализацией определённую последовательность символов, определяющую указатель. Семейство функций | Н/Д | Н/Д |
void** | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
Для каждого спецификатора преобразования, отличного от n, самая длинная последовательность символов входного потока, которая не превышает указанную ширину поля и которая либо точно соответствует ожиданиям спецификатора преобразования, либо является префиксом ожидаемой последовательности, потребляется из потока. Первый символ, если он есть, после этой потреблённой последовательности остаётся непрочитанным. Если потреблённая последовательность имеет нулевую длину или если потреблённая последовательность не может быть преобразована, как указано выше, происходит неудача сопоставления, за исключением случаев, когда произошёл конец файла, ошибка кодирования или ошибка чтения из потока, в этом случае происходит ошибка ввода.
Все спецификаторы преобразования, отличные от [, c, и n, потребляют и отбрасывают все ведущие пробельные символы (определяются так же, как при вызове iswspace) перед попыткой анализа входных данных. Эти потреблённые символы не учитываются при указании максимальной ширины поля.
Если спецификатор длины l не используется, спецификаторы преобразования c, s, и [ выполняют преобразование символов с широкой кодировки в многобайтовую как будто вызывая wcrtomb с объектом mbstate_t, инициализированным нулём перед преобразованием первого символа.
Спецификаторы преобразования s и [ всегда сохраняют нуль-терминатор в дополнение к совпавшим символам. Размер целевого массива должен быть как минимум на один больше, чем указанная ширина поля. Использование %s или %[, без указания размера целевого массива, так же небезопасно, как и std::gets.
Правильные спецификации преобразования для целочисленных типов фиксированной ширины (int8_t, и т. д.) определены в заголовочном файле <cinttypes> (хотя SCNdMAX, SCNuMAX, и т. д. является синонимом %jd, %ju, и т. д.).
После действия каждого спецификатора преобразования существует точка последовательности; это позволяет хранить несколько полей в одной переменной-"приемнике".
При разборе неполного значения с плавающей запятой, заканчивающегося в экспоненте без цифр, например, разборе "100er" со спецификатором преобразования %f, последовательность "100e" (самый длинный префикс, который может быть допустимым значением с плавающей запятой) потребляется, что приводит к ошибке соответствия (потреблённая последовательность не может быть преобразована в число с плавающей запятой), при этом "r" остаётся. Некоторые существующие реализации не следуют этому правилу и отменяют потребление только "100", оставляя "er", например, ошибка glibc 1765.
Возвращаемое значение
Количество успешно прочитанных аргументов или EOF в случае ошибки до назначения первого аргумента-получателя.
Пример
См. также
|
(C++11)(C++11)(C++11) | считывает отформатированный ввод символов с широкой кодировкой из stdin, потока файлаили буфера с использованием переменного списка аргументов (функция) |
Документация C для wscanf, fwscanf, swscanf |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/c/fwscanf