Организация ввода-вывода информации
Прежде чем программы смогут работать с данными, вам придется предусмотреть способ, посредством которого они будут попадать в компьютер. Поэтому ясно, что программам на С требуются функции, позволяющие им воспринимать данные и отображать результаты в доступной для чтения форме. В совокупности такие функции называются функциями ввода-вывода или обозначаются аббревиатурой 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, который читает каждый следующий символ, даже если этот символ является служебным.
Дата добавления: 2016-04-14; просмотров: 829;