scanf, fscanf, sscanf, scanf_s, fscanf_s, sscanf_s
| Определено в заголовке <stdio.h>
|
||
int scanf( const char* format, ... );
|
(1) | (до C99) |
int scanf( const char* restrict format, ... );
|
(начиная с C99) | |
int fscanf( FILE* stream, const char* format, ... );
|
(2) | (до C99) |
int fscanf( FILE* restrict stream, const char* restrict format, ... );
|
(начиная с C99) | |
int sscanf( const char* buffer, const char* format, ... );
|
(3) | (до C99) |
int sscanf( const char* restrict buffer, const char* restrict format, ... );
|
(начиная с C99) | |
int scanf_s(const char* restrict format, ...);
|
(4) | (начиная с C11) |
int fscanf_s(FILE* restrict stream, const char* restrict format, ...);
|
(5) | (начиная с C11) |
int sscanf_s(const char* restrict buffer, const char* restrict format, ...);
|
(6) | (начиная с C11) |
Считывает данные из различных источников, интерпретирует их в соответствии с format и сохраняет результаты в указанные места.
streambuffer. Достижение конца строки эквивалентно достижению условия конца файла для fscanf%c, %s и %[ ожидают два аргумента (обычный указатель и значение типа rsize_t, указывающее размер принимающего массива; это значение может быть 1 при чтении с помощью %c в один char) и за исключением того, что следующие ошибки обнаруживаются во время выполнения и вызывают установленную в данный момент функцию обработки ограничений:
- любой из аргументов типа указатель является нулевым указателем
format,streamилиbufferявляется нулевым указателем- количество символов, которое было бы записано с помощью
%c,%sили%[, плюс завершающий нулевой символ, превысит второй (rsize_t) аргумент, предоставленный для каждого из этих спецификаторов преобразования - опционально, любая другая обнаруживаемая ошибка, например, неизвестный спецификатор преобразования
scanf_s, fscanf_s и sscanf_s гарантированно доступны только если __STDC_LIB_EXT1__ определена реализацией и если пользователь определяет __STDC_WANT_LIB_EXT1__ как целочисленную константу 1 перед включением <stdio.h>.Параметры
| stream | - | входной файловый поток для чтения |
| buffer | - | указатель на строку символов, завершающуюся нулевым символом, из которой производится чтение |
| format | - | указатель на строку символов, завершающуюся нулевым символом, задающую способ чтения входных данных |
| ... | - | принимающие аргументы. |
Строка format состоит из:
- символов (кроме пробельных и
%) в многобайтовой кодировке: каждый такой символ в строке формата потребляет ровно один идентичный символ из входного потока; если следующий символ в потоке не совпадает, функция завершается с ошибкой. - пробельных символов: любой одиночный пробельный символ в строке формата потребляет все доступные последовательные пробельные символы из входного потока (определяемые как если бы вызовом isspace в цикле). Обратите внимание, что между
"\n"," ","\t\t"или другими пробельными символами в строке формата нет различия. - спецификаций преобразования. Каждая спецификация преобразования имеет следующий формат:
- вводный символ
%.
- вводный символ
- (необязательно) символ подавления присваивания
*. Если этот параметр присутствует, функция не присваивает результат преобразования никакому принимающему аргументу.
- (необязательно) символ подавления присваивания
- (необязательно) целое число (больше нуля), задающее максимальную ширину поля, то есть максимальное количество символов, которое функция может потребить при выполнении преобразования, указанного текущей спецификацией преобразования. Обратите внимание, что
%sи%[могут привести к переполнению буфера, если ширина не указана.
- (необязательно) целое число (больше нуля), задающее максимальную ширину поля, то есть максимальное количество символов, которое функция может потребить при выполнении преобразования, указанного текущей спецификацией преобразования. Обратите внимание, что
- (необязательно) модификатор длины, задающий размер принимающего аргумента, то есть фактический целевой тип. Это влияет на точность преобразования и правила переполнения. Тип назначения по умолчанию различается для каждого типа преобразования (см. таблицу ниже).
- спецификатор формата преобразования.
Доступны следующие спецификаторы формата:
| Спецификатор преобразования |
Пояснение | Ожидаемый тип аргумента | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Модификатор длины→ | hh
|
h
|
нет | l
|
ll
|
j
|
z
|
t
|
L
| |
| Доступно только с C99→ | Да | Да | Да | Да | Да | |||||
%
|
Соответствует литералу
%. |
Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
c
|
Соответствует символу или последовательности символов.
|
Н/Д | Н/Д | char* |
wchar_t* |
Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
s
|
Соответствует последовательности непробельных символов (строке).
| |||||||||
[набор ]
|
Соответствует непустой последовательности символов из набора символов.
| |||||||||
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* |
Н/Д |
b (C23)
|
Соответствует беззнаковому двоичному целому числу.
| |||||||||
i
|
Соответствует целому числу.
| |||||||||
u
|
Соответствует беззнаковому десятичному целому числу.
| |||||||||
o
|
Соответствует беззнаковому восьмеричному целому числу.
| |||||||||
xX
|
Соответствует беззнаковому шестнадцатеричному целому числу.
| |||||||||
n
|
Возвращает количество прочитанных к настоящему моменту символов.
| |||||||||
a (C99)A (C99)eEfF (C99)gG
|
Соответствует числу с плавающей запятой.
|
Н/Д | Н/Д | float* |
double* |
Н/Д | Н/Д | Н/Д | Н/Д | long double* |
p
|
Соответствует определяемой реализацией последовательности символов, задающей указатель.
|
. | Н/Д | void** |
Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
| Примечания | ||||||||||
|
Для каждого спецификатора преобразования, кроме За исключением спецификатора Все спецификаторы преобразования, кроме Спецификаторы преобразования Спецификаторы преобразования Правильные спецификации преобразования для целочисленных типов фиксированной ширины (int8_t и т. д.) определены в заголовке <inttypes.h> (хотя SCNdMAX, SCNuMAX и т. д. являются синонимами Существует точка последовательности после действия каждого спецификатора преобразования; это позволяет сохранять несколько полей в одну и ту же «принимающую» переменную. При разборе неполного числа с плавающей запятой, которое заканчивается на показатель степени без цифр, например при разборе Если спецификация преобразования недопустима, поведение не определено. | ||||||||||
Если спецификация преобразования недопустима, поведение не определено.
Возвращаемое значение
Сложность
Не гарантируется. В частности, некоторые реализации sscanf имеют сложность O(N), где N = strlen(buffer) [1].
Примечания
Поскольку большинство спецификаторов преобразования сначала потребляют все последовательные пробельные символы, такой код, как
scanf("%d", &a);
scanf("%d", &b);
прочитает два целых числа, введенных на разных строках (второй %d потребит символ новой строки, оставленный первым) или на одной строке, разделенных пробелами или табуляциями (второй %d потребит пробелы или табуляции).
Спецификаторы преобразования, которые не потребляют начальные пробелы, такие как %c, можно заставить это делать, используя пробельный символ в строке формата:
scanf("%d", &a);
scanf(" %c", &c); // consume all consecutive whitespace after %d, then read a char
Пример
#define __STDC_WANT_LIB_EXT1__ 1
#include <locale.h>
#include <stddef.h>
#include <stdio.h>
int main(void)
{
int i, j;
float x, y;
char str1[10], str2[4];
wchar_t warr[2];
setlocale(LC_ALL, "en_US.utf8");
char input[] = "25 54.32E-1 Thompson 56789 0123 56ß水";
/* parse as follows:
%d: an integer
%f: a floating-point value
%9s: a string of at most 9 non-whitespace characters
%2d: two-digit integer (digits 5 and 6)
%f: a floating-point value (digits 7, 8, 9)
%*d: an integer which isn't stored anywhere
' ': all consecutive whitespace
%3[0-9]: a string of at most 3 decimal digits (digits 5 and 6)
%2lc: two wide characters, using multibyte to wide conversion */
int ret = sscanf(input, "%d%f%9s%2d%f%*d %3[0-9]%2lc",
&i, &x, str1, &j, &y, str2, warr);
printf("Converted %d fields:\n"
"i = %d\n"
"x = %f\n"
"str1 = %s\n"
"j = %d\n"
"y = %f\n"
"str2 = %s\n"
"warr[0] = U+%x\n"
"warr[1] = U+%x\n",
ret, i, x, str1, j, y, str2, warr[0], warr[1]);
#ifdef __STDC_LIB_EXT1__
int n = sscanf_s(input, "%d%f%s", &i, &x, str1, (rsize_t)sizeof str1);
// writes 25 to i, 5.432 to x, the 9 bytes "Thompson\0" to str1, and 3 to n.
#endif
}
Возможный вывод:
Converted 7 fields:
i = 25
x = 5.432000
str1 = Thompson
j = 56
y = 789.000000
str2 = 56
warr[0] = U+df
warr[1] = U+6c34
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
- 7.21.6.2 Функция fscanf (стр.: TBD)
- 7.21.6.4 Функция scanf (стр.: TBD)
- 7.21.6.7 Функция sscanf (стр.: TBD)
- K.3.5.3.2 Функция fscanf_s (стр.: TBD)
- K.3.5.3.4 Функция scanf_s (стр.: TBD)
- K.3.5.3.7 Функция sscanf_s (стр.: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.21.6.2 Функция fscanf (стр.: 231-236)
- 7.21.6.4 Функция scanf (стр.: 236-237)
- 7.21.6.7 Функция sscanf (стр.: 238-239)
- K.3.5.3.2 Функция fscanf_s (стр.: 430-431)
- K.3.5.3.4 Функция scanf_s (стр.: 432)
- K.3.5.3.7 Функция sscanf_s (стр.: 433)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.21.6.2 Функция fscanf (стр.: 317-324)
- 7.21.6.4 Функция scanf (стр.: 325)
- 7.21.6.7 Функция sscanf (стр.: 326)
- K.3.5.3.2 Функция fscanf_s (стр.: 592-593)
- K.3.5.3.4 Функция scanf_s (стр.: 594)
- K.3.5.3.7 Функция sscanf_s (стр.: 596)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.19.6.2 Функция fscanf (стр.: 282-289)
- 7.19.6.4 Функция scanf (стр.: 290)
- 7.19.6.7 Функция sscanf (стр.: 291)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 4.9.6.2 Функция fscanf
- 4.9.6.4 Функция scanf
- 4.9.6.6 Функция sscanf
См. также
(C99)(C99)(C99)(C11)(C11)(C11) |
читает форматированный ввод из stdin, файлового потока или буфера с использованием списка аргументов переменной длины (функция) |
| получает строку символов из файлового потока (функция) | |
(C99)(C11)(C11)(C11)(C11) |
выводит форматированный вывод в stdout, файловый поток или буфер (функция) |
Документация C++ для scanf, fscanf, sscanf
| |