Книга: Язык программирования Си. Издание 3-е, исправленное
B1.3. Форматный ввод
B1.3. Форматный ввод
Функции scanf имеют дело с форматным преобразованием при вводе
int fscanf(FILE *stream, const char *format, ...);
fscanf читает данные из потока stream под управлением format и преобразованные величины присваивает по порядку аргументам, каждый из которых должен быть указателем. Завершает работу, если исчерпался формат. Выдает EOF по исчерпании файла или перед любым преобразованием, если возникла ошибка; в остальных случаях функция возвращает количество преобразованных и введенных элементов.
Форматная строка обычно содержит спецификации преобразования, которые используются для управления вводом. В форматную строку могут входить:
• пробелы и табуляции, которые игнорируются;
• обычные символы (кроме %), которые ожидаются в потоке ввода среди символов, отличных от символов-разделителей;
• спецификации преобразования, состоящие из %; необязательного знака *, подавляющего присваивание; необязательного числа, специфицирующего максимальную ширину поля; необязательных h, l или L, указывающих размер присваиваемого значения, и символа-спецификатора преобразования.
Спецификация преобразования определяет преобразование следующего поля ввода. Обычно результат размещается в переменной, на которую указывает соответствующий аргумент. Однако если присваивание подавляется с помощью знака *, как, например, в %*s, то поле ввода просто пропускается, и никакого присваивания не происходят. Поле ввода определяется как строка символов, отличных от символов-разделителей; при этом ввод строки прекращается при выполнении любого из двух условий: если встретился символ-разделитель или если ширина поля (в случае, когда она указана) исчерпана. Из этого следует, что при переходе к следующему полю scanf может "перешагивать" через границы строк, поскольку символ новой строки является символом-разделителем. (Под символами-разделителями понимаются символы пробела, табуляции, новой строки, возврата каретки, вертикальной табуляции и смены страницы.)
Символ-спецификатор указывает на способ интерпретации поля ввода. Соответствующий аргумент должен быть указателем. Список допустимых символов-спецификаторов приводится в таблице B-2.
Символам-спецификаторам d, i, n, o, u и x может предшествовать h, если аргумент есть указатель на short (а не int) или l (буква ell), если аргумент есть указатель на long. Символам-спецификаторам e, f и g может предшествовать l, если аргумент - указатель на double (а не float), или L, если аргумент - указатель на long double.
int scanf (const char *format, ...);
scanf(...) делает то же, что и fscanf(stdin, ...).
int sscanf (const char *s, const char *format, ...);
sscanf(s, ...) делает то же, что и scanf(...), только ввод символов осуществляет из строки s.
Таблица B-2. Преобразования scanf
Символ | Данные на вводе; тип аргумента |
---|---|
d | десятичное целое; int * |
i | целое: int *. Целое может быть восьмеричным (с нулем слева) или шестнадцатеричным (с 0x или 0X слева) |
o | восьмеричное целое (с нулем слева или без него); int * |
u | беззнаковое десятичное целое; unsigned int * |
x | шестнадцатеричное целое (с 0x или 0X слева или без них): int * |
c | символы, char *. Символы ввода размещаются в указанном массиве в количестве, заданном шириной поля; по умолчанию это количество равно 1. Символ'' не добавляется. Символы-разделители здесь рассматриваются как обычные символы и поступают в аргумент. Чтобы прочесть следующий символ-разделитель, используйте %1s |
s | строка символов, отличных от символов-разделителей (записывается без кавычек); char *, указывающий на массив размера достаточного, чтобы вместить строку и добавляемый к ней символ '' |
e, f, g | число с плавающей точкой; float *. Формат ввода для float состоит из необязательного знака, строки цифр, возможно с десятичной точкой, и необязательного порядка, состоящего из E или e и целого, возможно со знаком |
p | значение указателя в виде, в котором printf ("%р") его напечатает; void * |
n | записывает в аргумент число символов, прочитанных к этому моменту в этом вызове; int *. Никакого чтения ввода не происходит. Счетчик числа введенных элементов не увеличивается |
[...] | выбирает из ввода самую длинную непустую строку, состоящую из символов, заданных в квадратных скобках: char *. В конец строки добавляется ''. Спецификатор вида []...] включает ] в задаваемое множество символов |
[^...] | выбирает из ввода самую длинную непустую строку, состоящую из символов, не входящих в заданное в скобках множество. В конец добавляется ''. Спецификатор вида [^]...] включает ] в задаваемое множество символов |
% | обычный символ %; присваивание не делается |
- B1.7. Функции обработки ошибок
- Глава 7. Ввод и вывод
- 7.4 Форматный ввод (scanf)
- B1.6. Функции позиционирования файла
- 7.2 Форматный вывод (printf)
- B1. Ввод-вывод: ‹stdio.h›
- B1.2. Форматный вывод
- B1.4. Функции ввода-вывода символов
- B1.5. Функции прямого ввода-вывода
- Процедуры ввода и вывода
- 1.6 Драйверы и буферы ввода-вывода
- 1.8 Ввод-вывод типичного приложения хранения данных