• Название:

    Бочков С. О., Субботин Д. М. Язык программиро...


  • Размер: 0.5 Мб
  • Формат: PDF
  • или
  • Сообщить о нарушении / Abuse

Установите безопасный браузер



  • Название: ЧАСТЬ II
  • Автор: Хозяин

Предпросмотр документа

ЧАСТЬ II
СТАНДАРТНАЯ БИБЛИОТЕКА ЯЗЫКА СИ
В языке Си стандартная библиотека более сильно интегрирована с языком по
сравнению с другими языками программирования высокого уровня. Без использования
функций стандартной библиотеки не может быть написана ни одна серьезная программа на
языке Си, в частности потому, что в самом языке Си нет никаких средств ввода/вывода
информации.
Стандартную библиотеку функций языка Си можно разделить на две категории:
функции, которые имеются в библиотеке любой системы программирования языка Си для
различных операционных систем и различных архитектур компьютеров, и функции, которые
являются уникальными в рамках какой-либо системы программирования, или обеспечивают
доступ к специфическим возможностям конкретной операционной системы, или связаны с
конкретной архитектурой компьютера.
Функции первой категории образуют переносимое ядро библиотеки; программы, в
которых используются только такие библиотечные функции, могут быть перенесены в
другую систему программирования, другую операционную систему и/или на другой тип
архитектуры компьютеров с наименьшими затратами. Плата за универсальность и
переносимость

невозможность
воспользоваться
специфическими
средствами,
предоставляемыми конкретной вычислительной средой.
Функции второй категории предоставляют возможность получить доступ к функциям
ядра данной операционной системы, к внутренним структурам данных операционной
системы, к регистрам используемых аппаратных устройств. Кроме того, ко второй
категории относятся функции, которые добавлены в библиотеку, исходя из вкусовых
привязанностей разработчиков конкретной системы программирования — как им видится
удобный набор средств для разработки различных алгоритмов (сравните, например,
функции setmem и memset). В современных системах программирования Си в рамках общей
тенденции к стандартизации такие необоснованные расширения библиотек сокращаются, но
в ранних системах программирования разнобой был крайне высок.
К сожалению, наборы функций второй категории не согласованы даже для различных
систем программирования в рамках одной операционной системы на одном типе архитектур
компьютеров. Четко прослеживается это и на примере систем программирования ТС и MSC.
Библиотечные функции, обеспечивающие интерфейс для вызова одной и той же функции
операционной системы, могут иметь не только разные параметры, но и разные названия.
Эти несогласованности объясняются, с одной стороны, коммерческими соображениями
— стремлением удержать под контролем рынок программного обеспечения, чтобы
пользователи,
начавшие
программировать
с
использованием
одной
системы
программирования, покупали затем более новые программные продукты той же фирмы, а с
другой стороны, поздним появлением стандарта на язык и на его библиотеку и
независимости эволюции от версии к версии каждой системы программирования. При этом,
надо отметить, происходит постепенное сближение различных систем программирования по
мере того, как каждая из них заимствует наиболее ценные идеи у конкурентов. Так,
различия между библиотеками более поздних версий систем программирования MSC и ТС
отчасти сокращены по сравнению с первыми версиями.
Данную часть книги следует рассматривать в первую очередь как справочник по
стандартной библиотеке языка Си двух систем программирования — MSC и ТС — для
компьютеров типа IBM PC. Она также будет полезна для разработчиков новых систем
программирования Си, поскольку в ней проводится сравнение реализации различных
библиотечных функций двух широко распространенных систем программирования.
Из-за ограничений по объему в книгу не вошло описание специальных графических
библиотек Си систем программирования MSC и ТС.
Структура описания библиотеки такова: сначала дается краткое описание различных
групп функций и вводятся основные понятия, используемые далее при описании
библиотечных функций. Затем приводится полное описание всех функций в алфавитном
порядке.
Предпринята попытка дать детальное описание библиотечных функций, приводится
описание
используемых
констант,
как
они
описываются

помощью
директивы
препроцессора #define) во включаемых файлах.
Авторы считают, что для эффективной разработки качественного программного
обеспечения на языке Си программист должен представлять нижний уровень реализации
языка и его стандартной библиотеки. Поэтому иногда дается описание деталей (в
частности, связанных с использованием системных вызовов ОС и имен типов, введенных с
помощью конструкции typedef), которые часто сознательно замалчиваются в документации
по библиотекам.

По нашему мнению, пользователь должен обладать полной информацией, осознавая при
этом, с какими проблемами он столкнется при переносе программ в новую версию системы
программирования, в новую операционную систему или на компьютер другой архитектуры.
Обозначение ANSI, используемое в полном описании библиотеки, указывает, что
отмеченная библиотечная функция включена в стандарт языка Си.

9 КРАТКОЕ ОПИСАНИЕ БИБЛИОТЕКИ
Ниже приводится краткое описание основных групп функций для быстрой ориентации в
библиотеке. При этом вводятся основные понятия, используемые при описании
библиотечных функций (в частности, связанные с организацией ввода/вывода). Также
указывается, в каком стандартном включаемом (по директиве препроцессора #include)
файле содержится описание прототипа функции, относящихся к ней структур данных и
констант.

9.1

Работа с областями памяти и строками

В стандартной библиотеке есть специальная группа Функций для обработки областей
памяти, которые рассматриваются как последовательности байтов.
Если размер области, с которой необходимо работать, задается явно, будем
называть такую область буфером.
Другое используемое понятие — строка. Отличие строки от буфера в том, что ее
размер задается не явно, а определяется первым встретившимся при просмотре строки
слева направо нулевым байтом (имеющим значение '\0'), причем считается, что этот
нулевой байт также принадлежит строке.
Для копирования буферов, для присваивания каждому байту в пределах указанного
буфера заданного значения и для сравнения содержимого двух буферов предназначены
следующие функции:
Функция
Краткое описание
memccpy
копирует символы из одного буфера в другой до тех пор, пока не будет
скопирован заданный символ или не будет скопировано определенное число
символов
memchr
возвращает указатель на первое вхождение заданного символа в буфере
memcmp
сравнивает указанное число символов из двух буферов
memlcmp
сравнивает указанное число символов двух буферов, считая строчные и
прописные буквы эквивалентными
memcpy
копирует указанное количество символов из одного буфера в другой
memset
инициализирует заданным значением указанное количество байтов в буфере
movedata копирует определенное количество символов из одного буфера в другой,
даже когда буфера находятся в разных сегментах
Прототипы перечисленных функций содержатся в файле memory.h (MSC) и в файлах
mem.h и string.h (ТС).
Система программирования ТС предоставляет дополнительно следующие функции для
работы с буферами:
Функция
Краткое описание
memove
копирует указанное количество символов из одного буфера в другой
movmem
копирует указанное количество символов из одного буфера в другой
setmem
инициализирует заданным значением указанное количество байтов в буфере
Прототипы функций memmove и movmem содержатся в файлах mem.h и string.h.
Прототип функции setmem содержится в файле mem.h.
Для работы со строками существуют следующие библиотечные функции (ТС & MSC):
Функция
Краткое описание
strcat
катенация (склеивание) строк
strchr
найти первое вхождение заданного символа в строке
strcmp
сравнить две строки
strcpy
копировать одну строку в другую
strcspn
найти первое вхождение символа из заданного набора символов в строке
strdup
дублирование строки
strerror сформировать в строке сообщение об ошибке, состоящее из двух частей:
системной диагностики и необязательного добавочного пользовательского
сообщения
stricmp
сравнить две строки, считая символы нижнего и верхнего регистров
эквивалентными
strlen
вычислить длину строки

strlwr
strncat
strncmp
strncpy
strnicmp
strnset
strpbrk
strrchr
strrev
strset
strspn
strstr
strtok
strupr

преобразовать строку в нижний регистр (строчные буквы)
добавить n символов в строку
сравнение n символов в двух строках
скопировать n символов из одной строки в другую
сравнение n символов двух строк
установить n символов в строке в заданное значение
найти первое вхождение любого символа из заданного набора в строке
найти последнее вхождение заданного символа в строке
инвертировать (перевернуть) строку
установить все символы строки в заданное значение
найти первую подстроку из заданного набора символов в строке
найти первую подстановку одной строки (более короткой) в другой
найти следующую точку в строке
преобразовать строку в верхний регистр (заглавные буквы)

Кроме того, система программирования MSC предоставляет дополнительно функцию
strcmpi (идентична функции stricmp), а система программирования ТС предоставляет
функцию stpcpy (идентична функции strcpy, но возвращает в точку вызова другое
значение).
Прототипы всех функций работы со строками содержатся в файле string.h. Все
функции работают со строками, завершающимися нулевым байтом ('\0'). Для работы с
массивом символов, не имеющим в конце нулевого байта, вы можете использовать функции
преобразования буферов, описанные выше.

9.2

Определение класса символов и преобразование символов

Функция
isalnum
isalpha
isascii
iscntrl
isdigit
isgraph
islower
isprint
ispunct
isspace
isupper
isxdigit
toascii
tolower
toupper
_tolower
_toupper

Краткое описание
проверка на букву или цифру
проверка на букву
проверка на символ из набора кодировки ASCII
проверка на управляющий символ
проверка на десятичную цифру
проверка на печатный символ, исключая пробел
проверка на малую букву
проверка на печатный символ
проверка на знак пунктуации
проверка на пробельный символ
проверка на заглавную букву
проверка на шестнадцатеричную цифру
преобразование символа в код ASCII
проверка и преобразование в малую букву, если заглавная буква
проверка и преобразование малой буквы в заглавную
преобразование буквы в малую (без проверки)
преобразование буквы в заглавную (без проверки)

Все эти функции реализованы как макроопределения, заданные в файле ctype.h

9.3

Форматные преобразования данных

Функция
atof
atoi
atol
ecvt
fcvt
gcvt
itoa
ltoa
ultoa

преобразование
преобразование
преобразование
преобразование
преобразование
преобразование
преобразование
преобразование
преобразование

Краткое описание
строки, в представляемое ей число типа float
строки в число типа int (целое)
строки в число типа long (длинное целое)
числа типа double в строку
числа типа double в строку
числа типа double в строку
числа типа int в строку
числа типа long в строку
числа типа unsigned long в строку

Система
Функция
strtod
strtol
strtoul

программирования ТС предоставляет также следующие функции:
Краткое описание
преобразование строки в число типа double (покрывает возможности atof)
преобразование строки в число типа long (покрывает возможности atol)
преобразование строки в число типа unsigned long

Прототипы всех перечисленных функций содержатся
функции atof содержится, кроме того, в файле math.h.

9.4

в

файле

stdlib.h.

Прототип

Работа с каталогами файловой системы

Функция
chdir
getcwd
mkdir
rmdir
Система
функции:
Функция
findfirst
findnext
fnmerge
fnsplit
getcurdir
getdisk
searchpath
setdisk

Краткое описание
изменение текущего рабочего каталога
получить имя текущего рабочего каталога
создать новый каталог
удаление каталога
программирования

ТС

предоставляет,

кроме

перечисленных,

следующие

Краткое описание
начало поиска файла по шаблону имени
продолжение поиска файла по шаблону имени
создание имени файла из отдельных компонент
разбиение имени файла на отдельные компоненты
узнать текущий каталог
узнать текущее устройство
поиск файла в различных каталогах
задать текущее устройство

В системе программирования MSC прототипы функций содержатся в файле direct.h, в
системе программирования ТС прототипы функций содержатся в файле dir.h.

9.5

Операции над файлами

Функция
access
chmod
filelength
isatty
mktemp
remove
rename
setmode

Краткое описание
определение прав доступа к файлу
изменение прав доступа к файлу
измерение длины файла
проверка, является ли устройство символьным
генерация уникального имени файла
уничтожение файла
переименование файла
установить новые значения для параметров файла

Система
Функция
chsize
fstat
locking

программирования MSC предоставляет дополнительно следующие функции:
Краткое описание
изменение размера файла
получение информации о файле
запирает область в файле (работает с версией ОС MS-DOS 3.0 и выше),
временно запрещая к ней доступ со стороны других процессов, или отпирает
эту область
получение информации о файле
установка маски для выбора режима работы по умолчанию
удаление файла

slat
umask
unlink

Система программирования ТС предоставляет дополнительно функции:
Функция
Краткое описание
chmod
изменение прав доступа к файлу
lock
запирает область файла для доступа со стороны других процессов (работает
с версией MS-DOS 3.0 и выше)
unlock
отпирает область (работает с версией MS-DOS 3.0 и выше)
Прототипы функций, за исключением функций fstat и stat, содержатся в файле io.h;
прототипы функций fstat и stat описаны в файле sys\stat.h.
Функции access, chmod, rename, stat и unlink оперируют с файлами, которые
задаются через имя пути (pathname) -или через имя файла.
Функции chsize, filelength, isatty, locking, setmode, fstat работают с уже
открытыми файлами, которые определяются дескрипторами (handle) (смотри далее описание
функций ввода/вывода нижнего уровня).

9.6

Ввод и вывод

Функции ввода и вывода в стандартной библиотеке Си позволяют читать данные из
файлов или получать их с устройств ввода (например, с клавиатуры) и записывать данные
в файлы, или выводить их на различные устройства (например, на принтер).
Функции ввода/вывода делятся на три класса:
1) Ввод/вывод верхнего уровня (с использованием понятия "поток").
2) Ввод/вывод для консольного терминала путем непосредственного обращения к нему.
3) Ввод/вывод нижнего уровня (с использованием понятия "дескриптор").
В библиотеке есть также функции для работы с последовательным портом (СОМ), они
отнесены условно ко второй группе.
функции ввода/вывода верхнего уровня обеспечивают буферизацию работы с файлами.
Это означает, что, когда производится чтение информации из файла или запись
информации в файл, обмен информацией осуществляется не между программой и указанным
файлом, а между программой и промежуточным буфером, расположенным в оперативной
памяти.
Если производится операция записи в файл, то информация из буфера записывается в
файл при заполнении буфера или при закрытии файла (или при выполнении каких-то других
условий, смотри ниже). Если информация считывается из файла, то она на самом деле
берется из буфера, а в буфер информация считывается из файла при открытии файла и
впоследствии каждый раз при исчерпании (опустошении) буфера. Буферизация ввода/вывода
выполняется автоматически, она позволяет ускорить выполнение программы за счет
уменьшения
количества
обращений
к
сравнительно
медленно
работающим
внешним
устройствам.
Для пользователя файл, открытый на верхнем уровне, представляется как
последовательность
считываемых
или
записываемых
байтов.
Чтобы
отразить
эту
особенность организации ввода/вывода, предложено понятие "поток" (соответствует
английскому слову stream). Когда файл открывается, с ним связывается поток, выводимая
информация записывается "в поток", считываемая информация берется "из потока".
Когда поток открывается для ввода/вывода, он связывается со структурой типа FILE
(имя типа FILE определяется с помощью конструкции typedef в файле stdio.h). Структура
содержит разнообразную информацию о файле. При открытии файла с помощью функции fopen
возвращается указатель на структуру типа FILE. Этот указатель (указатель потока)
используется для последующих операций с файлом, пользователь не обязан вникать в
способ организации потока, он только должен сохранить полученный указатель и
передавать его значение всем библиотечным функциям, используемым для ввода/вывода
через этот поток.
Функции
в/в
верхнего
уровня
дают
возможность
для
буферизованного
форматированного и неформатированного ввода/вывода.
Функции в/в верхнего уровня относятся к числу функций, одинаково реализуемых в
различных ОС и на разных компьютерах, с их помощью пользователь имеет возможность
писать переносимые программы.
Функции ввода/вывода для консоли и порта распространяют возможности функций
ввода/вывода верхнего уровня на этот класс устройств, добавляя новые возможности.
Они позволяют читать или записывать на консоль (терминал) или в порт
ввода/вывода (например, порт принтера). Функции в/в с портом читают или записывают
данные побайтно. Некоторые дополнительные режимы устанавливаются для в/в с консоли
(например: ввод с эхо-печатью символов и без эхо-печати).
Функции в/в для консоли и порта являются уникальными для компьютеров типа
IBM/PC.
Функции в/в низкого уровня не выполняют буф