Прежде чем программы смогут работать с данными, вам придется предусмотреть способ, посредством которого они будут попадать в компьютер. Поэтому ясно, что программам на С требуются функции, позволяющие им воспринимать данные и отображать результаты в доступной для чтения форме. В совокупности такие функции называются функциями ввода-вывода или обозначаются аббревиатурой I/O (Input/Output).
Одной из положительных характеристик языка С является его переносимость. Это означает, что одна и та же функция ввода-вывода должна подобно работать в условиях эксплуатации различного оборудования. Фактически у любого современного компьютера имеется клавиатура и монитор. И то, и другое устройство предназначено для символьной обработки – мы набираем символы на клавиатуре и видим их отображение на экране монитора. Следовательно, представляется разумным иметь в С такие элементарные функции ввода-вывода, которые ограничиваются работой с тем, что пользователь может ввести: такого рода ввод-вывод называется символьно-ориентированным. Конечно, такой ввод-вывод обладает существенными ограничениями, однако он эффективен и переносим.
Для поддержки символьно-ориентированного ввода-вывода все реализации языка С включают в себя функции printf (форматированный вывод) и scanf (форматированный ввод). Термин форматированный употреблен здесь в том смысле, что указанные функции обеспечивают заданные автоматические преобразования форматов данных. Для использования функций printf и scanf в программу необходимо вставить команду препроцессора #include <stdio.h>.Функции printf и scanfимеют переменное число аргументов. Числа и типы аргументов должны соответствовать спецификациям преобразования в форматной (символьной) строке.
Функция форматированного вывода printf (записать аргументы в стандартный файл вывода в соответствии с форматной строкой).
Список аргументов функции printf определяется следующим образом:
<format> [, argument1]...
Здесь format - это управляющая строка (строка символов), задающая требуемые при вводе форматные преобразования.
В общем случае format описывается строкой со следующей структуры:
%[flags] [width] [.precision] [{h | l | I64 | L}]type
Прежде чем рассматривать указанные элементы формата заметим, что обязательными являются только % и type.
type (в русскоязычной литературе – спецификатор) может принимать значения в соответствии с таблицей:
type
| Результат
| Образец
|
%c
| Одиночный символ
| ‘?’
|
%d
| Десятичное целое число
|
|
%e
| Число с плавающей точкой в экспоненциальном представлении
| 3.500e+000
|
%E
| Число с плавающей точкой в экспоненциальном представлении
| 3.500E+000
|
%f
| Число с плавающей точкой в десятичном представлении
| 3.5
|
%g
| Используют %f или %e в зависимости от значения. %e используется, если показатель меньше чем –4 или больше либо равен заданной точности.
|
|
%G
| То же, только для %E.
|
|
%i
| Десятичное целое число со знаком
|
|
%o
| Восьмеричное целое число без знака
|
|
%p
| Указатель (адрес памяти)
| 0064FDF4
|
%s
| Строка символов
| “Str”
|
%u
| Десятичное целое число без знака
|
|
%x
| Шестнадцатеричное целое число без знака (с цифрами abcdef)
| 1f
|
%X
| Шестнадцатеричное целое число без знака (с цифрами ABCDEF)
| 1F
|
%%
| Печать знака процента
|
|
Каждая реализация языка может расширять предложенный в таблице список. Форматы %E, %G, %i, %p и %X встречаются не во всех реализациях языка.
Все прочие элементы строки формата называются модификаторами и служат для уточнения формы представления информации при выводе.
В следующей таблице представлены варианты элемента flags.
Флаг
| Значение
| Образец
|
–
| Определяет выравнивание по левому краю
| %–20s
|
+
| Печатать знак
| %+d
|
Пробел
| Положительные значения печатаются без знака, но с пробелом, отрицательные со знаком «минус»
| % 6.2f
|
| Для числовых форм заполняет поле по ширине нулями вместо пробелов. Этот флаг игнорируется, если указан флаг «–» или указана точность для целочисленной формы
| %010d,
%08.3f
|
#
| Вывод первого 0 для восьмеричных, 0x или 0X для 16-ых. Для всех форм с плавающей точкой гарантируется вывод символа десятичной точки. Для форм %g %G предотвращает удаление заключительных нулей.
| %#o,
%#8.0f,
%+#10.3E
|
Модификатор формата width (ширина) представляется целым положительным числом и служит для указания минимального количества выводимых символов. Если количество символов выводимого значения меньше width, поле будет дополняться символами в соответствии с указанными флагами. Значение width никогда не ограничивает выводимое значение.
Модификатор формата .precision (точность) используется для чисел с плавающей точкой. Точность представляется неотрицательным целым числом, следующим за точкой и задает либо количество символов, которое должно быть выведено, либо количество цифр в дробной части числа, либо количество значащих цифр.
Возвращаемое значение функции printf. Как обычная функция языка С printf объявлена функцией возвращающей целое значение. При нормальном выполнении, когда все заказанные преобразования удается выполнить, в качестве результирующего значения возвращается общее число выведенных байтов. При возникновении невыполнимых преобразований возвращается отрицательное значение.
Функция форматированного ввода информации scanf (записать аргументы в стандартный файл ввода в соответствии с форматной строкой)
В целом функция вода scanf очень похожа на функцию printf. Она также использует строку, задающую необходимые форматные преобразования. Главное различие этих функций заключается в списке параметров. Функция printf использует имена переменных, константы и выражения. Функция scanf в качестве параметров использует только указатели на переменные, т.е. адреса заполняемых переменных.
- для ввода значения для одного из основных типов переменной, перед именем переменной ставьте символ &;
- для ввода строки в символьный массив, знак & не ставится.
Информация, принимаемая функцией scanf, поступает в виде потока символов, набираемых на клавиатуре. Среди них могут быть и служебные символы, такие как табуляция, пробел, символ перевода строки и т. п. Эти символы позволяют разделить поток ввода на отдельные поля. Это соответствует последовательным применениям спецификаций преобразований к последовательным полям, с пропуском служебных символов между ними. Единственное исключение составляет спецификатор преобразования %c, который читает каждый следующий символ, даже если этот символ является служебным.