Главная
страница 1 ... страница 17страница 18страница 19страница 20страница 21 ... страница 23страница 24

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. Символ'\0' не добавляется. Символы-разделители здесь рассматриваются как обычные символы и поступают в аргумент. Чтобы прочесть следующий символ-разделитель, используйте %1s

s

строка символов, отличных от символов-разделителей (записывается без кавычек); char *, указывающий на массив размера достаточного, чтобы вместить строку и добавляемый к ней символ '\0'

e, f, g

число с плавающей точкой; float *. Формат ввода для float состоит из необязательного знака, строки цифр, возможно с десятичной точкой, и необязательного порядка, состоящего из E или e и целого, возможно со знаком

p

значение указателя в виде, в котором printf ("%р") его напечатает; void *

n

записывает в аргумент число символов, прочитанных к этому моменту в этом вызове; int *. Никакого чтения ввода не происходит. Счетчик числа введенных элементов не увеличивается

[...]

выбирает из ввода самую длинную непустую строку, состоящую из символов, заданных в квадратных скобках: char *. В конец строки добавляется '\0'. Спецификатор вида []...] включает ] в задаваемое множество символов

[^...]

выбирает из ввода самую длинную непустую строку, состоящую из символов, не входящих в заданное в скобках множество. В конец добавляется '\0'. Спецификатор вида [^]...] включает ] в задаваемое множество символов

%

обычный символ %; присваивание не делается




<< предыдущая страница   следующая страница >>
Смотрите также:
Б. Керниган, Д. Ритчи Язык программирования Си Издание 3-е, исправленное Перевод с английского под редакцией Вс. С. Штаркмана Невский Диалект, Санкт-Петербург 2001
3942.83kb.
24 стр.
Шарп Перевод на русский язык под общей редакцией В. Зеленского Санкт-Петербург Б. С. К
2473.89kb.
10 стр.
Как запад стал богатым
5224.01kb.
30 стр.
Сведения о квалификации педагогических кадров
1227.17kb.
5 стр.
Тактика штурмовой авиации
1780.85kb.
12 стр.
Правила написания и оформления дипломных работ издание 3-е, исправленное и дополненное
840.67kb.
6 стр.
Николе М., Шварц Р. Н 63 Семейная терапия. Концепции и методы/Пер, с англ. О. Очкур, А. Шишко
3577.21kb.
23 стр.
Издание 3-е, исправленное Научный редактор издания профессор В. В. Целищев сибирское университетское издательство новосибирского университета новосибирск 2001
12957.91kb.
60 стр.
Сильвия Крэнстон при участии Кэри Уильямс Жизнь и творчество основательницы современного теософского движения Блаватской е. П. Перевод с английского под редакцией
8089.17kb.
47 стр.
Проблемы здоровья и экологии
3773.97kb.
37 стр.
Санкт-Петербург Москва • Харьков • Минск 2001
144.58kb.
1 стр.
Поэтический художественный перевод с английского языка на русский язык: Томас Харди. Thomas Hardy. His Immortality
7.24kb.
1 стр.