
- •6000, Interdata 8/32. Язык "c", однако, не связан с каки-
- •1 Является учебным введением в центральную часть языка "c".
- •1.1. Hачинаем
- •Раздел 7.4. Функция scanf во многом сходна с printf , но она
- •1.5.3. Подсчет символов
- •If (выражение)
- •1.7. Функции
- •1.8. Аргументы - вызов по значению
- •1.10. Область действия: внешние переменные
- •1.11. Резюме
- •2.1. Имена переменных
- •2.9. Побитовые логические операции
- •3.5. Циклы - while и for
- •3.6. Цикл do - while
- •3.7. Оператор break
- •3.8. Оператор continue
- •If (disaster)
- •4.2. Функции, возвращающие нецелые значения
- •2 И 3; она обрабатывает необязательно знак и десятичную точ-
- •4.4. Внешние переменные
- •1, Это соображение следует использовать с определенной осто-
- •If ( число )
- •4.6. Статические переменные
- •4.7. Регистровые переменные
- •4.10. Рекурсия
- •4.11.2. Макроподстановка
- •5.1. Указатели и адреса
- •5.5. Указатели символов и функции
- •5.11. Командная строка аргументов
- •Int argc;
- •5.12. Указатели на функции
- •6.2. Структуры и функции
- •6.5. Структуры, ссылающиеся на себя
- •Int count; /* number of occurrences */
- •8 Мы продемонстрируем, как правильно выполнить эту задачу.
- •Int hashval;
- •6.7. Поля
- •Int ival;
- •6.9. Определение типа
- •Int count; /* number of occurrences */
- •7.1. Обращение к стандартной библиотеке
- •7.2. Стандартный ввод и вывод - функции getchar и putchar
- •7.3. Форматный вывод - функция printf
- •7.4. Форматный ввод - функция scanf
- •7.5. Форматное преобразование в памяти
- •7.6. Доступ к файлам
- •7.7. Обработка ошибок - stderr и exit
- •7.8. Ввод и вывод строк
- •8.1. Дескрипторы файлов
- •8.2. Низкоуровневый ввод/вывод - операторы read и write
- •8.4. Произвольный доступ - seek и lseek
- •8.6. Пример - распечатка справочников
- •Ino_t&_ino; /*inode number*/
- •Ino_t st_ino; /* inode number */
- •13. Объекты и l-значения
- •15.1. Первичные выражения
- •15.2. Унарные операции
- •15.3. Мультипликативные операции
- •15.4. Аддитивные операции
- •15.5. Операции сдвига
- •15.6. Операции отношения
- •15.14. Операция присваивания
- •15.15. Операция запятая
- •16. Описания
- •16.1. Спецификаторы класса памяти
- •16.4. Смысл описателей
- •Int count;
- •16.6. Инициализация
- •0;Неинициализированные автоматические и регистровые перемен-
- •17.7. Оператор switch
- •18.1. Внешнее определение функции
- •19.1. Лексическая область действия
- •19.2. Область действия внешних идентификаторов
- •24. Соображения о переносимости
- •28. Тип перечисления
- •29. Таблица изображений непечатных символов языка "c".
7.1. Обращение к стандартной библиотеке
Каждый исходный файл, который обращается к функции из
стандартной библиотеки, должен вблизи начала содержать стро-
ку
#INCLUDE
в файле STDIO.H определяются некоторые макросы и переменные,
используемые библиотекой ввода/вывода. Использование угловых
скобок вместо обычных двойных кавычек - указание компилятору
искать этот файл в справочнике, содержащем заголовки стан-
дартной информации (на системе UNIX обычно LUSRLINELUDE).
Кроме того, при загрузке программы может оказаться необ-
ходимым указать библиотеку явно; на системе PDP-11 UNIX,
например, команда компиляции программы имела бы вид:
CC исходные файлы и т.д. -LS
где -LS указывает на загрузку из стандартной библиотеки.
7.2. Стандартный ввод и вывод - функции getchar и putchar
Самый простой механизм ввода заключается в чтении по од-
ному символу за раз из "стандартного ввода", обычно с терми-
нала пользователя, с помощью функции GETCHAR. Функция
GETCHAR() при каждом к ней обращении возвращает следующий
вводимый символ. В большинстве сред, которые поддерживают
язык "с", терминал может быть заменен некоторым файлом с по-
мощью обозначения < : если некоторая программа PROG исполь-
зует функцию GETCHAR то командная строка
PROG : если PROG использует PUTCHAR,
то командная строка
PROG>OUTFILE
приведет к записи стандартного вывода в файл OUTFILE, а не
на терминал. На системе UNIX можно также использовать поточ-
ный механизм. Строка
PROG \! ANOTHERPROG
помещает стандартный вывод PROG в стандартный ввод
ANOTHERPROG. И опять PROG не будет осведомлена об изменении
направления.
Вывод, осуществляемый функцией PRINTF, также поступает в
стандартный вывод, и обращения к PUTCHAR и PRINTF могут пе-
ремежаться.
Поразительное количество программ читает только из одно-
го входного потока и пишет только в один выходной поток; для
таких программ ввод и вывод с помощью функций GETCHAR,
PUTCHAR и PRINTF может оказаться вполне адекватным и для на-
чала определенно достаточным. Это особенно справедливо тог-
да, когда имеется возможность указания файлов для ввода и
вывода и поточный механизм для связи вывода одной программы
с вводом другой. Рассмотрим, например, программу LOWER, ко-
торая преобразует прописные буквы из своего ввода в строч-
ные:
#INCLUDE
MAIN() /* CONVERT INPUT TO LOWER CASE */
\(
INT C;
WHILE ((C = GETCHAR()) != EOF)
PUTCHAR(ISUPPER(C) ? TOLOWER(C) : C);
\)
"Функции" ISUPPER и TOLOWER на самом деле являются макроса-
ми, определенными в STDIO.H . Макрос ISUPPER проверяет, яв-
ляется ли его аргумент буквой из верхнего регистра, и возв-
ращает ненулевое значение, если это так, и нуль в противном
случае. Макрос TOLOWER преобразует букву из верхнего регист-
ра в ту же букву нижнего регистра. Независимо от того, как
эти функции реализованы на конкретной машине, их внешнее по-
ведение совершенно одинаково, так что использующие их прог-
раммы избавлены от знания символьного набора.
Если требуется преобразовать несколько файлов, то можно
собрать эти файлы с помощью программы, подобной утилите CAT
системы UNIX,
CAT FILE1 FILE2 ... \! LOWER>OUTPUT
и избежать тем самым вопроса о том, как обратиться к этим
файлам из программы. (Программа CAT приводится позже в этой
главе).
Кроме того отметим, что в стандартной библиотеке вво-
да/вывода "функции" GETCHAR и PUTCHAR на самом деле могут
быть макросами. Это позволяет избежать накладных расходов на
обращение к функции для обработки каждого символа. В главе 8
мы продемонстрируем, как это делается.