Функция scanf( ) использует некоторые специальные знаки (про белы, символы табуляции и "новая строка") для разбиения входного потока символов на отдельные поля. Она согласует последовательность спецификаций преобразования с последовательностью полей, опуская упомянутые специальные знаки между ними. Обратите внимание, что наша входная информация располагается на двух строках. Точно так же мы могли бы использовать одну или пять строк при условии, что вводимые величины разделяются по крайней мере одним знаком типа "новой строки", пробела или символа табуляции. Единственным исключением из этого является спецификация %с, обеспечивающая чтение каждого следующего символа даже в том случае, если это "пустой символ".
Функция scanf( ) использует практически тот же набор символов спецификации преобразования, что и функция printf( ). Основные отличия в случае функции scanf( ) следующие:
1. Отсутствует спецификация %g.
2. Спецификации %f и %е эквивалентны. Обе спецификации до пускают наличие (или отсутствие) знака, строки цифр с десятичной точкой или без нее и поля показателя степени.
3. Для чтения целых чисел типа short применяется спецификация %h.
Функция scanf( ) не является одной из наиболее часто используемых функций языка Си. Мы обсуждаем ее здесь главным образом из-за ее универсальности (она позволяет читать данные всех имеющихся типов); однако в Си имеется еще несколько других функций, осуществляющих ввод, например getchar( ) и gets( ), которые более удобны для выполнения конкретных задач - чтения одиночных символов или строк, содержащих пробелы. Мы рассмотрим некоторые из этих функций в гл. 6, 13 и 15.
СОВЕТЫ ПО ПРИМЕНЕНИЮ
Задание фиксированной ширины полей оказывается полезным при печати данных столбцами. Поскольку шириной поля по умолчанию является "ширина" числа, при повторном использовании оператора
будут получены неровные столбцы чисел, если эти числа состоят из разного количества цифр. Например, результат мог бы выглядеть следующим образом:
(Здесь предполагается, что между обращениями к оператору печати значения переменных изменялись.)
Эти же данные можно представить в улучшенном виде, если за дать достаточно большую фиксированную ширину поля. При использовании оператора
результат будет выглядеть так:
Наличие пробелов между спецификациями преобразования гарантирует, что даже в том случае, если все поле будет заполнено, символы, соответствующие данному числу, не перейдут в следующее поле.
Это вызвано тем обстоятельством, что обычные символы, имеющиеся в управляющей строке, включая пробелы, всегда печатаются.
С другой стороны, если печатаемое число включено в некоторую фразу, то часто при его выводе оказывается удобным задать поля равной или меньше требуемой. Это дает возможность включить число в фразу без добавления лишних пробелов. Например, результатом работы оператора:
могла бы быть следующая фраза:
ЧТО ВЫ ДОЛЖНЫ БЫЛИ УЗНАТЬ В ЭТОЙ ГЛАВЕ
Что такое строка символов: несколько символов, расположенных в ряд.
Как записывать строку символов: " несколько символов, расположенных в ряд".
Как строка хранится в памяти: " несколько символов, расположенных в ряд\0".
Где разместить строку: char phrase[25] или static char phrase[25].
Как определить длину строки: использовать функцию strlen(строка).
Как распечатать строку: printf(" %s", phrase).
Как прочитать строку, состоящую из одного слова: scanf(" %s " ,&name).
Как задать числовую константу: #define TWO 2.
Как задать символьную константу: #define WOW '!'.
Как задать строковую константу: #define WARN "He делай этого!".
Спецификации преобразования при вводе-выводе: %d %f %e %g %c %s %u % o %х.
Как улучшить вид входной информации: %-10d %3.2f.
Как выполнять преобразования: printf(" %d %о %c\h", WOW, WOW, WOW);
ВОПРОСЫ И ОТВЕТЫ
Рассмотрение приводимых ниже вопросов должно помочь вам глубже УСВОИТЬ материал данной главы.
Вопросы