На этом шаге мы перечислим остальные функции.
Перечислим остальные функции, которые могут использоваться при организации ввода/вывода в языке C:
getchar();
Вводит с клавиатуры один символ и выдает его. Обращаться к этой функции можно так:
char с; (или int с;) c=getchar();
putchar(char с);
Выводит значение переменной с (один символ) на стандартное выводное устройство. Обращение:
putchar(с);
scanf (Control, arg1, arg2, ..., argn);
Функция форматного ввода с клавиатуры. Осуществляет посимвольный ввод данных с клавиатуры, преобразует их в соответствии с форматом для каждого значения, указанным в управляющей (форматной) символьной строке Control, и результат преобразования записывает в аргументы argl, arg2, ..., argn. Смысл строки Control тот же, что и для функции printf().
Так как argl, arg2, ..., argn - это выходные параметры функции, то при обращении к функции они должны задаваться своими адресами: имена массивов - именами (т. к. имена массивов - это указатели на их первые элементы), а те аргументы, что не являются указателями, задаются как &arg.
Форматная строка - это символьная строка, содержащая три типа объектов: незначащие символы, значащие символы и спецификации формата.
Незначащие символы - это пробел, знак табуляции (\t), символ перехода на новую строку (\n). Как только функция встречает незначащий символ в строке формата, она считывает (но не сохраняет) все последующие незначащие символы до тех пор, пока не встретится первый значащий символ (т. е. пропускает незначащие символы).
Значащие символы - это все символы кода ASCII, кроме символа %. Eсли функция встречает в форматной строке значащий символ, она его считывает, но не сохраняет.
Спецификация формата функции имеет вид:
%[*] [ширина] [F/N] [h/l] символ формата
После символа начала формата % в определенном порядке следуют остальные спецификации.
[*] - это необязательный символ подавления ввода: весь входной поток функция рассматривает как совокупность полей ввода: значащих символов. Если в спецификации указан символ *, то все поле, которое должно в данный момент обрабатываться функцией по заданному формату, пропускается.
Ввод происходит так: в соответствии со спецификатором ширины первого формата из входного потока выбирается очередное поле ввода (т.е. значащие символы до первого незначащего), которое интерпретируется соответствии с форматом и записывается в соответствующий аргумент.
Если при этом запрошенная ширина оказалась меньше поля ввода, то остаток поля обрабатывается функцией по следующему формату.
Если запрошенная ширина оказалась больше поля ввода, то все поле ввода обрабатывается по данному формату.
Если же в объявлении формата присутствовал символ подавления ввода *, то все поле, предназначенное для обработки данным форматом пропускается.
Модификаторы размера аргумента и символы форматирования функции scanf() аналогичны модификаторам и символам форматирования функции printf().
Рассмотрим пример работы функции scanf(). Допустим, задано:
int i; float x; char m[100];
На клавиатуре набираем последовательность:
56789 0123 45а72
Выполняем:
scanf ("%2d %f %*d %2s", &i, &x, m);
Как будет идти ввод?
В примере имеются три поля ввода: 56789, 0123 и 45а72. Наберем их на клавиатуре и нажмем клавишу Enter. Функция в соответствии с первым форматом (%2d) выбирает из первого поля первые два символа, интерпретирует их как десятичное число и присваивает значение первому аргументу: i = 56.
В первом поле остались необработанными символы 789. Они попадают в работу функции по второму формату: %f. Второй аргумент получит значение х = 789. Далее должно обрабатываться поле 0123 по третьему формату, но в нем есть символ подавления. Поэтому поле пропускается и начинает обрабатываться поле 45а72 по формату %2s. Из этого поля будут выбраны только первые два символа и строка m получит значение 45.
sprintf (string, Control, arg1, arg2, ..., argn);
Эта функция аналогична printf(), за исключением того, что результат своей работы она выводит не на стандартное устройство вывода, а в строку string. Это позволяет собирать в одну строку данные совершенно разных типов.
sscanf (string, Control, argl, arg2, ..., argn);
Эта функция аналогична scanf(), за исключением того, что входные данные для ее работы поступают не со стандартного устройства ввода, а из строки string. Это позволяет выделять в строке различные группы данных совершенно разных типов и помещать их в отдельные переменные.
gets (s);
Вводит строку символов с клавиатуры и записывает ее в строку s, котороя может быть объявлена как char *s или char s[].
puts (s);
Выводит содержимое строки s на устройство стандартного вывода (экран) (s может быть объявлена как char *s или char s[]).
Со следующего шага мы начнем рассматривать ввод/вывод в языке C++.