Язык программирования Си для персонального компьютера
Шрифт:
Функции первой категории образуют переносимое ядро библиотеки; программы, в которых используются только такие библиотечные функции, могут быть перенесены в другую систему программирования, другую операционную систему и/или на другой тип архитектуры компьютеров с наименьшими затратами. Плата за универсальность и переносимость — невозможность воспользоваться специфическими средствами, предоставляемыми конкретной вычислительной средой.
Функции второй категории предоставляют возможность получить доступ к функциям ядра данной операционной системы, к внутренним структурам данных операционной системы, к регистрам используемых аппаратных устройств. Кроме того, ко второй категории относятся функции, которые добавлены в библиотеку, исходя из вкусовых привязанностей разработчиков конкретной системы программирования — как им видится удобный набор средств для разработки различных алгоритмов (сравните, например, функции setmem и memset). В современных системах программирования Си в рамках общей тенденции к стандартизации такие необоснованные расширения библиотек сокращаются, но в ранних системах программирования разнобой был крайне высок.
К сожалению, наборы функций второй категории не согласованы даже для различных систем программирования в рамках одной операционной
Эти несогласованности объясняются, с одной стороны, коммерческими соображениями — стремлением удержать под контролем рынок программного обеспечения, чтобы пользователи, начавшие программировать с использованием одной системы программирования, покупали затем более новые программные продукты той же фирмы, а с другой стороны, поздним появлением стандарта на язык и на его библиотеку и независимости эволюции от версии к версии каждой системы программирования. При этом, надо отметить, происходит постепенное сближение различных систем программирования по мере того, как каждая из них заимствует наиболее ценные идеи у конкурентов. Так, различия между библиотеками более поздних версий систем программирования MSC и ТС отчасти сокращены по сравнению с первыми версиями.
Данную часть книги следует рассматривать в первую очередь как справочник по стандартной библиотеке языка Си двух систем программирования — MSC и ТС — для компьютеров типа IBM PC. Она также будет полезна для разработчиков новых систем программирования Си, поскольку в ней проводится сравнение реализации различных библиотечных функций двух широко распространенных систем программирования.
Из-за ограничений по объему в книгу не вошло описание специальных графических библиотек Си систем программирования MSC и ТС.
Структура описания библиотеки такова: сначала дается краткое описание различных групп функций и вводятся основные понятия, используемые далее при описании библиотечных функций. Затем приводится полное описание всех функций в алфавитном порядке.
Предпринята попытка дать детальное описание библиотечных функций, приводится описание используемых констант, как они описываются (с помощью директивы препроцессора #define) во включаемых файлах.
Авторы считают, что для эффективной разработки качественного программного обеспечения на языке Си программист должен представлять нижний уровень реализации языка и его стандартной библиотеки. Поэтому иногда дается описание деталей (в частности, связанных с использованием системных вызовов ОС и имен типов, введенных с помощью конструкции typedef), которые часто сознательно замалчиваются в документации по библиотекам.
По нашему мнению, пользователь должен обладать полной информацией, осознавая при этом, с какими проблемами он столкнется при переносе программ в новую версию системы программирования, в новую операционную систему или на компьютер другой архитектуры.
Обозначение ANSI, используемое в полном описании библиотеки, указывает, что отмеченная библиотечная функция включена в стандарт языка Си.
КРАТКОЕ ОПИСАНИЕ БИБЛИОТЕКИ
Ниже приводится краткое описание основных групп функций для быстрой ориентации в библиотеке. При этом вводятся основные понятия, используемые при описании библиотечных функций (в частности, связанные с организацией ввода/вывода). Также указывается, в каком стандартном включаемом (по директиве препроцессора #include) файле содержится описание прототипа функции, относящихся к ней структур данных и констант.
Работа с областями памяти и строками
В стандартной библиотеке есть специальная группа Функций для обработки областей памяти, которые рассматриваются как последовательности байтов.
Если размер области, с которой необходимо работать, задается явно, будем называть такую область буфером.
Другое используемое понятие — строка. Отличие строки от буфера в том, что ее размер задается не явно, а определяется первым встретившимся при просмотре строки слева направо нулевым байтом (имеющим значение '\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 | добавить n символов в строку |
strncmp | сравнение n символов в двух строках |
strncpy | скопировать n символов из одной строки в другую |
strnicmp | сравнение n символов двух строк |
strnset | установить n символов в строке в заданное значение |
strpbrk | найти первое вхождение любого символа из заданного набора в строке |
strrchr | найти последнее вхождение заданного символа в строке |
strrev | инвертировать (перевернуть) строку |
strset | установить все символы строки в заданное значение |
strspn | найти первую подстроку из заданного набора символов в строке |
strstr | найти первую подстановку одной строки (более короткой) в другой |
strtok | найти следующую точку в строке |
strupr | преобразовать строку в верхний регистр (заглавные буквы) |
Кроме того, система программирования MSC предоставляет дополнительно функцию strcmpi (идентична функции stricmp), а система программирования ТС предоставляет функцию stpcpy (идентична функции strcpy, но возвращает в точку вызова другое значение).
Прототипы всех функций работы со строками содержатся в файле string.h. Все функции работают со строками, завершающимися нулевым байтом ('\0'). Для работы с массивом символов, не имеющим в конце нулевого байта, вы можете использовать функции преобразования буферов, описанные выше.
Определение класса символов и преобразование символов
Функция | Краткое описание |
isalnum | проверка на букву или цифру |
isalpha | проверка на букву |
isascii | проверка на символ из набора кодировки ASCII |
iscntrl | проверка на управляющий символ |
isdigit | проверка на десятичную цифру |
isgraph | проверка на печатный символ, исключая пробел |
islower | проверка на малую букву |
isprint | проверка на печатный символ |
ispunct | проверка на знак пунктуации |
isspace | проверка на пробельный символ |
isupper | проверка на заглавную букву |
isxdigit | проверка на шестнадцатеричную цифру |
toascii | преобразование символа в код ASCII |
tolower | проверка и преобразование в малую букву, если заглавная буква |
toupper | проверка и преобразование малой буквы в заглавную |
_tolower | преобразование буквы в малую (без проверки) |
_toupper | преобразование буквы в заглавную (без проверки) |