std::vscanf, std::vfscanf, std::vsscanf
Определено в заголовочном файле <cstdio> | ||
|---|---|---|
int vscanf( const char* format, std::va_list vlist ); | (1) | (начиная с C++11) |
int vfscanf( std::FILE* stream, const char* format, std::va_list vlist ); | (2) | (начиная с C++11) |
int vsscanf( const char* buffer, const char* format, std::va_list vlist ); | (3) | (начиная с C++11) |
Считывает данные из различных источников, интерпретирует их в соответствии с format и сохраняет результаты в местах, указанных vlist.
stdin.stream.buffer.Параметры
| stream | - | входной файловый поток для чтения |
| buffer | - | указатель на строку символов с нулевым завершающим символом, из которой выполняется чтение |
| format | - | указатель на строку символов с нулевым завершающим символом, задающую способ чтения входных данных |
| vlist | - | список аргументов переменной длины, содержащий аргументы-приёмники. |
Строка format состоит из
- многобайтовых символов, не являющихся пробельными, за исключением
%: каждый такой символ в строке формата считывает из входного потока ровно один совпадающий символ либо приводит к сбою функции, если следующий символ в потоке не равен ему. - пробельных символов: любой отдельный пробельный символ в строке формата считывает из входных данных все доступные подряд идущие пробельные символы (определяемые так, как если бы в цикле вызывалась
std::isspace). Обратите внимание: между"\n"," ","\t\t"и другими пробельными символами в строке формата нет различий. - спецификаторов преобразования. Каждый спецификатор преобразования имеет следующий формат:
- вводный символ
%. -
(необязательно) символ подавления присваивания
*. Если этот параметр указан, функция не присваивает результат преобразования ни одному аргументу-приёмнику. -
(необязательно) целое число (больше нуля), задающее максимальную ширину поля, то есть максимальное количество символов, которое функция может считать при выполнении преобразования, заданного текущим спецификатором. Обратите внимание:
%sи%[могут привести к переполнению буфера, если ширина не указана. - (необязательно) модификатор длины, задающий размер аргумента-приёмника, то есть фактический тип назначения. Он влияет на точность преобразования и правила обработки переполнения. Тип назначения по умолчанию различается для каждого типа преобразования (см. таблицу ниже).
- спецификатор формата преобразования.
Доступны следующие спецификаторы формата:
| Спецификатор преобразования | Описание | Ожидаемый тип аргумента |
||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Модификатор длины→ |
hh |
h | нет |
l |
ll |
j |
z |
t |
L |
|
| Доступно только начиная с C++11→ | Да | Да | Да | Да | Да | |||||
% | Соответствует литералу %. | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
c | Соответствует одному символу или последовательности символов.
| Н/Д | Н/Д |
char*
|
wchar_t*
| Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
s | Соответствует последовательности непробельных символов (строке).
|
|||||||||
[набор ] | Соответствует непустой последовательности символов из набора символов.
|
|||||||||
d | Соответствует десятичному целому числу.
|
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) | Соответствует беззнаковому двоичному целому числу.
|
|||||||||
i | Соответствует целому числу.
|
|||||||||
u | Соответствует беззнаковому десятичному целому числу.
|
|||||||||
o | Соответствует беззнаковому восьмеричному целому числу.
|
|||||||||
xX | Соответствует беззнаковому шестнадцатеричному целому числу.
|
|||||||||
n | Возвращает количество прочитанных к этому моменту символов.
|
|||||||||
a (C++11)A (C++11)eEfF (C++11)gG | Соответствует числу с плавающей запятой.
| Н/Д | Н/Д |
float*
|
double*
| Н/Д | Н/Д | Н/Д | Н/Д |
longdouble*
|
p | Соответствует определяемой реализацией последовательности символов, представляющей указатель.
| Н/Д | Н/Д |
void**
| Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
| Примечания | ||||||||||
| Для каждого спецификатора преобразования, кроме За исключением спецификатора Все спецификаторы преобразования, кроме Спецификаторы преобразования Спецификаторы преобразования Правильные спецификации преобразования для целочисленных типов фиксированной ширины ( После выполнения каждого спецификатора преобразования имеется точка следования; это позволяет сохранять несколько полей в одной переменной-приёмнике. При разборе неполного значения с плавающей запятой, заканчивающегося экспонентой без цифр, например при разборе Если спецификация преобразования недопустима, поведение не определено. |
||||||||||
Возвращаемое значение
Количество успешно считанных аргументов или EOF в случае сбоя.
Примечания
Все эти функции вызывают va_arg как минимум один раз; значение arg после возврата функции не определено. Эти функции не вызывают va_end — это должен сделать вызывающий код.
Пример
#include <cstdarg>
#include <cstdio>
#include <iostream>
#include <stdexcept>
void checked_sscanf(int count, const char* buf, const char *fmt, ...)
{
std::va_list ap;
va_start(ap, fmt);
if (std::vsscanf(buf, fmt, ap) != count)
throw std::runtime_error("parsing error");
va_end(ap);
}
int main()
{
try
{
int n, m;
std::cout << "Parsing '1 2'... ";
checked_sscanf(2, "1 2", "%d %d", &n, &m);
std::cout << "success\n";
std::cout << "Parsing '1 a'... ";
checked_sscanf(2, "1 a", "%d %d", &n, &m);
std::cout << "success\n";
}
catch (const std::exception& e)
{
std::cout << e.what() << '\n';
}
}
Вывод:
Parsing '1 2'... success Parsing '1 a'... parsing error
См. также
считывает форматированный ввод из stdin, файлового потока или буфера (функция) |
|
|
(C++11) | выводит форматированные данные в stdout, файловый поток или буферс использованием списка аргументов переменной длины (функция) |
Документация по C для vscanf, vfscanf, vsscanf |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/c/vfscanf