vscanf, vfscanf, vsscanf, vscanf_s, vfscanf_s, vsscanf_s
Определено в заголовочном файле <stdio.h> | ||
|---|---|---|
int vscanf( const char* restrict format, va_list vlist ); | (1) | (начиная с C99) |
int vfscanf( FILE* restrict stream, const char* restrict format,
va_list vlist );
| (2) | (начиная с C99) |
int vsscanf( const char* restrict buffer, const char* restrict format,
va_list vlist );
| (3) | (начиная с C99) |
int vscanf_s(const char* restrict format, va_list vlist); | (4) | (начиная с C11) |
int vfscanf_s( FILE* restrict stream, const char* restrict format,
va_list vlist);
| (5) | (начиная с C11) |
int vsscanf_s( const char* restrict buffer, const char* restrict format,
va_list vlist);
| (6) | (начиная с C11) |
Считывает данные из различных источников, интерпретирует их согласно format и сохраняет результаты в местах, заданных vlist.
stdin
stream
buffer. Достижение конца строки эквивалентно достижению конца файла для fscanf
%c, %s и %[ ожидаются по два аргумента (обычный указатель и значение типа rsize_t, указывающее размер принимающего массива; при считывании с помощью %c в один символ char оно может быть равно 1), а также за исключением того, что во время выполнения обнаруживаются следующие ошибки и вызывается установленная в данный момент функция обработчика ограничений: - любой аргумент типа указателя является нулевым указателем
-
format,streamилиbufferявляется нулевым указателем - количество символов, которое было бы записано с помощью %c, %s или %[, вместе с завершающим нулевым символом, превысило бы второй аргумент (rsize_t), переданный для каждого из этих спецификаторов преобразования
- при необходимости — любая другая обнаруживаемая ошибка, например неизвестный спецификатор преобразования
vscanf_s, vfscanf_s и vsscanf_s гарантированно доступны только в том случае, если реализация определяет __STDC_LIB_EXT1__, а пользователь задаёт __STDC_WANT_LIB_EXT1__ целочисленную константу 1 до включения <stdio.h>.Параметры
| stream | - | входной файловый поток для чтения |
| buffer | - | указатель на строку символов с завершающим нулевым символом, из которой выполняется чтение |
| format | - | указатель на строку символов с завершающим нулевым символом, задающую способ чтения входных данных |
| vlist | - | список аргументов переменной длины, содержащий принимающие аргументы. |
Строка format состоит из
- не являющихся пробельными многобайтовых символов, кроме
%: каждый такой символ в строке формата считывает из входного потока ровно один идентичный символ или приводит к сбою функции, если следующий символ в потоке не совпадает с ним. - пробельных символов: любой одиночный пробельный символ в строке формата считывает из входных данных все доступные идущие подряд пробельные символы (определяется так, как если бы в цикле вызывалась функция
isspace). Обратите внимание: между"\n"," ","\t\t"и другими пробельными символами в строке формата нет различий. - спецификаторов преобразования. Каждый спецификатор преобразования имеет следующий формат:
- вводный символ
%. -
(необязательно) символ подавления присваивания
*. Если этот параметр указан, функция не присваивает результат преобразования ни одному принимающему аргументу. -
(необязательно) целое число (больше нуля), задающее максимальную ширину поля, то есть максимальное количество символов, которое функция может считать при выполнении преобразования, заданного текущим спецификатором преобразования. Обратите внимание:
%sи%[могут привести к переполнению буфера, если ширина не указана. - (необязательно) модификатор длины, задающий размер принимающего аргумента, то есть фактический тип назначения. Он влияет на точность преобразования и правила переполнения. Тип назначения по умолчанию различается для каждого типа преобразования (см. таблицу ниже).
- спецификатор формата преобразования.
Доступны следующие спецификаторы формата:
| Спецификатор преобразования | Описание | Ожидаемый тип аргумента |
||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Модификатор длины→ |
hh |
h | нет |
l |
ll |
j |
z |
t |
L |
|
| Доступен только начиная с C99→ | Да | Да | Да | Да | Да | |||||
% | Соответствует буквальному символу %. | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
c | Соответствует одному символу или последовательности символов.
| Н/Д | Н/Д |
char*
|
wchar_t*
| Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
s | Соответствует последовательности непробельных символов ( строке).
|
|||||||||
[набор ] | Соответствует непустой последовательности символов из набора символов.
|
|||||||||
d | Соответствует десятичному целому числу.
|
signedchar* или unsignedchar*
|
signedshort* или unsignedshort*
|
signedint* или unsignedint*
|
signedlong* или unsignedlong*
|
signedlonglong* или unsignedlonglong*
|
intmax_t* или uintmax_t*
|
size_t*
|
ptrdiff_t*
| Н/Д |
b (C23) | Соответствует беззнаковому двоичному целому числу.
|
|||||||||
i | Соответствует целому числу.
|
|||||||||
u | Соответствует беззнаковому десятичному целому числу.
|
|||||||||
o | Соответствует беззнаковому восьмеричному целому числу.
|
|||||||||
xX | Соответствует беззнаковому шестнадцатеричному целому числу.
|
|||||||||
n | Возвращает количество уже считанных символов.
|
|||||||||
a (C99)A (C99)eEfF (C99)gG | Соответствует числу с плавающей точкой.
| Н/Д | Н/Д |
float*
|
double*
| Н/Д | Н/Д | Н/Д | Н/Д |
longdouble*
|
p | Соответствует определяемой реализацией последовательности символов, задающей указатель.
| Н/Д | Н/Д |
void**
| Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
| Примечания | ||||||||||
| Для каждого спецификатора преобразования, кроме За исключением спецификатора Все спецификаторы преобразования, кроме Спецификаторы преобразования Спецификаторы преобразования Правильные спецификации преобразования для целочисленных типов фиксированной ширины ( После выполнения каждого спецификатора преобразования наступает точка следования; это позволяет сохранять несколько полей в одной переменной-приёмнике. При разборе неполного значения с плавающей точкой, которое заканчивается экспонентой без цифр, например при разборе Если спецификация преобразования недопустима, поведение не определено. |
||||||||||
Возвращаемое значение
EOF, если ошибка чтения произошла до присваивания значения первому принимающему аргументу.EOF.Примечания
Все эти функции вызывают va_arg как минимум один раз; после возврата значение arg не определено. Эти функции не вызывают va_end — это должен сделать вызывающий код.
Пример
#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>
bool checked_sscanf(int count, const char* buf, const char* fmt, ...)
{
va_list ap;
va_start(ap, fmt);
int rc = vsscanf(buf, fmt, ap);
va_end(ap);
return rc == count;
}
int main(void)
{
int n, m;
printf("Parsing '1 2'...");
if (checked_sscanf(2, "1 2", "%d %d", &n, &m))
puts("success");
else
puts("failure");
printf("Parsing '1 a'...");
if (checked_sscanf(2, "1 a", "%d %d", &n, &m))
puts("success");
else
puts("failure");
}
Вывод:
Parsing '1 2'...success Parsing '1 a'...failure
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
- 7.21.6.9 Функция vfscanf (стр.: TBD)
- 7.21.6.11 Функция vscanf (стр.: TBD)
- 7.21.6.14 Функция vsscanf (стр.: TBD)
- K.3.5.3.9 Функция vfscanf_s (стр.: TBD)
- K.3.5.3.11 Функция vscanf_s (стр.: TBD)
- K.3.5.3.14 Функция vsscanf_s (стр.: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.21.6.9 Функция vfscanf (стр.: TBD)
- 7.21.6.11 Функция vscanf (стр.: TBD)
- 7.21.6.14 Функция vsscanf (стр.: TBD)
- K.3.5.3.9 Функция vfscanf_s (стр.: TBD)
- K.3.5.3.11 Функция vscanf_s (стр.: TBD)
- K.3.5.3.14 Функция vsscanf_s (стр.: TBD)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.21.6.9 Функция vfscanf (стр.: 327)
- 7.21.6.11 Функция vscanf (стр.: 328)
- 7.21.6.14 Функция vsscanf (стр.: 330)
- K.3.5.3.9 Функция vfscanf_s (стр.: 597-598)
- K.3.5.3.11 Функция vscanf_s (стр.: 599)
- K.3.5.3.14 Функция vsscanf_s (стр.: 602)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.19.6.9 Функция vfscanf (стр.: 293)
- 7.19.6.11 Функция vscanf (стр.: 294)
- 7.19.6.14 Функция vsscanf (стр.: 295)
См. также
|
(C11)(C11)(C11) | считывают форматированные входные данные из stdin, файлового потока или буфера (функция) |
|
(C99)(C11)(C11)(C11)(C11) | выводят форматированные данные в stdout, файловый поток или буферс использованием списка аргументов переменной длины (функция) |
Документация C++ для vscanf, vfscanf, vsscanf |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/io/vfscanf