вscanf, вfscanf, вsscanf, вscanf_s, вfscanf_s, вsscanf_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.
streambuffer. Достижение конца строки эквивалентно достижению конца файла для fscanf%c, %s и %[ ожидают по два аргумента (обычный указатель и значение типа rsize_t, указывающее размер принимающего массива, которое может быть 1 при чтении с %c в один символ) и за исключением того, что следующие ошибки обнаруживаются во время выполнения и вызывают текущую установленную функцию обработчика ограничений:
- любой аргумент типа указателя является нулевым указателем
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→ | Да | Да | Да | Да | Да | |||||
%
|
Сопоставляет литерал
%. |
N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A |
c
|
Сопоставляет символ или последовательность символов.
|
N/A | N/A | char* |
wchar_t* |
N/A | N/A | N/A | N/A | N/A |
s
|
Сопоставляет последовательность непробельных символов (строку).
| |||||||||
[set ]
|
Сопоставляет непустую последовательность символов из set символов.
| |||||||||
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* |
N/A |
b (C23)
|
Сопоставляет беззнаковое двоичное целое число.
| |||||||||
i
|
Сопоставляет целое число.
| |||||||||
u
|
Сопоставляет беззнаковое десятичное целое число.
| |||||||||
o
|
Сопоставляет беззнаковое восьмеричное целое число.
| |||||||||
xX
|
Сопоставляет беззнаковое шестнадцатеричное целое число.
| |||||||||
n
|
Возвращает количество символов, прочитанных на данный момент.
| |||||||||
a (C99)A (C99)eEfF (C99)gG
|
Сопоставляет число с плавающей запятой.
|
N/A | N/A | float* |
double* |
N/A | N/A | N/A | N/A | long double* |
p
|
Сопоставляет определённую реализацией последовательность символов, представляющую указатель.
|
N/A | N/A | void** |
N/A | N/A | N/A | N/A | N/A | N/A |
| Примечания | ||||||||||
|
Для каждого спецификатора преобразования, кроме За исключением спецификатора Все спецификаторы преобразования, кроме Спецификаторы преобразования Спецификаторы преобразования Правильные спецификации преобразования для целочисленных типов фиксированной ширины (int8_t и т. д.) определены в заголовке <inttypes.h> (хотя SCNdMAX, SCNuMAX и т. д. являются синонимами Существует точка последовательности после действия каждого спецификатора преобразования; это позволяет сохранять несколько полей в одну и ту же «принимающую» переменную. При разборе неполного числа с плавающей запятой, которое заканчивается показателем степени без цифр, например при разборе Если спецификация преобразования недопустима, поведение не определено. | ||||||||||
Возвращаемое значение
Примечания
Все эти функции вызывают 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 (p: TBD)
- 7.21.6.11 Функция vscanf (p: TBD)
- 7.21.6.14 Функция vsscanf (p: TBD)
- K.3.5.3.9 Функция vfscanf_s (p: TBD)
- K.3.5.3.11 Функция vscanf_s (p: TBD)
- K.3.5.3.14 Функция vsscanf_s (p: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.21.6.9 Функция vfscanf (p: TBD)
- 7.21.6.11 Функция vscanf (p: TBD)
- 7.21.6.14 Функция vsscanf (p: TBD)
- K.3.5.3.9 Функция vfscanf_s (p: TBD)
- K.3.5.3.11 Функция vscanf_s (p: TBD)
- K.3.5.3.14 Функция vsscanf_s (p: TBD)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.21.6.9 Функция vfscanf (p: 327)
- 7.21.6.11 Функция vscanf (p: 328)
- 7.21.6.14 Функция vsscanf (p: 330)
- K.3.5.3.9 Функция vfscanf_s (p: 597-598)
- K.3.5.3.11 Функция vscanf_s (p: 599)
- K.3.5.3.14 Функция vsscanf_s (p: 602)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.19.6.9 Функция vfscanf (p: 293)
- 7.19.6.11 Функция vscanf (p: 294)
- 7.19.6.14 Функция vsscanf (p: 295)
См. также
(C11)(C11)(C11) |
читает форматированный ввод из stdin, файлового потока или буфера (функция) |
(C99)(C11)(C11)(C11)(C11) |
печатает форматированный вывод в stdout, файловый поток или буфер с использованием списка аргументов переменной длины (функция) |
Документация C++ для vscanf, vfscanf, vsscanf
| |