Керниган и Ритчи - Язык программирования Си (793773), страница 61
Текст из файла (страница 61)
нижеотреализациистроку,Последовательные вызовы strtok разбивают строку s на лексемы. Ограничителем лексемы служит любойсимвол из строки ct. В первом вызове указатель s не равен NULL. Функция находит в строке s первуюлексему, состоящую из символов, не входящих в ct; ее работа заканчивается тем, что поверх следующегосимвола пишется '\0' и возвращается указатель на лексему. Каждый последующий вызов, в которомуказатель s равен NULL, возвращает указатель на следующую лексему, которую функция будет искать сразуза концом предыдущей.
Функция strtok возвращает NULL, если далее никакой лексемы не обнаружено.Параметр ct от вызова к вызову может варьироваться.Функции mem... предназначены для манипулирования с объектами как с массивами символов; ихназначение — получить интерфейсы к эффективным программам. В приведенной ниже таблице s и tпринадлежат типу void *; cs и ct — типу const void *; n — типу size_t; а с имеет значение типаint, приведенное к типу char.void *memcpy(s, ct, n)копирует n символов из ct в s и возвращает svoid *memmove(s, ct, n)делает то же самое, что и memcpy, но работает и в случае"перекрывающихся" объектов.int memcmp(cs, ct, n)сравнивает первые n символов cs и ct; выдает тот же результат, что ифункция strcmpvoid *memchr(cs, c, n)возвращает указатель на первое вхождение символа с в cs или, еслисреди первых n символов с не встретилось, NULLvoid *memset(s, с, n)размещает символ с в первых n позициях строки s и возвращает sВ 4.
Математические функции: <math. h>В заголовочном файле <math.h> описываются математические функции и определяются макросы.Макросы EDOM и ERANGE (находящиеся в <errno.h>) задают отличные от нуля целочисленные константы,используемые для фиксации ошибки области и ошибки диапазона; HUGE_VAL определена какположительное значение типа double.
Ошибка области возникает, если аргумент выходит за областьзначений, для которой определена функция. Фиксация ошибки области осуществляется присвоением errnoзначения EDOM; возвращаемое значение зависит от реализации. Ошибка диапазона возникает тогда, когдарезультат функции не может быть представлен в виде double.
В случае переполнения функция возвращаетHUGE_VAL с правильным знаком и в errno устанавливается значение ERANGE. Если результат оказываетсяменьше, чем возможно представить данным типом, функция возвращает нуль, а устанавливается ли в этомслучае в errno ERANGE, зависит от реализации. Далее x и y имеют тип double, n — тип int, и все функциивозвращают значения типа double.
Углы в тригонометрических функциях задаются в радианах.sin(x)синус xcos(x)косинус xtan(x)тангенс xasin(x)арксинус х в диапазоне *-/2, /2], х[-1, 1]acos(x)арккосинус x диапазоне *0, ], х[-1, 1]atan(x)арктангенс х в диапазоне *-/2, /2]atan2(y, x)арктангенс y/х в диапазоне *-, ]sinh(x)гиперболический синус хcosh(x)гиперболический косинус хtanh(x)гиперболический тангенс хexp(x)экспоненциальная функция еxlog(x)натуральный логарифм ln(x), х > 0log10(x)десятичный логарифм log10(x), х > 0pow(x, y)xy.
Ошибка области, если х = 0 и y < 0 или x < 0 и y — не целоеsqrt(x)корень квадратный из x, х > 0ceil(x)наименьшее целое в виде double, которое не меньше xfloor(x)наибольшее целое в виде double, которое не больше хfabs(x)абсолютное значение |x|ldexp(x, n)x * 2nfrexp(x, int *exp)разбивает х на два сомножителя, первый из которых — нормализованнаядробь в интервале *1/2, 1), которая возвращается, а второй — степеньдвойки, эта степень запоминается в *ехр. Если х — нуль, то обе частирезультата равны нулюmodf(x, double *ip)разбивается на целую и дробную части, обе имеют тот же знак, что и х. Целаячасть запоминается в *ip, дробная часть выдается как результатfmod(x, y)остаток от деления х на y в виде числа с плавающей точкой.
Знак результатасовпадает со знаком х. Если y равен нулю, результат зависит от реализацииВ 5. Функции общего назначения: <stdlib. h>Заголовочный файл <stdlib.h> объявляет функции, предназначенные для преобразования чисел, запросапамяти и других задач.double atof(const char *s)atof переводит s в double; эквивалентна strtod(s, (char**) NULL).int atoi(const char *s)переводит s в int; эквивалентна (int) strtol (s, (char**)NULL, 10).int atol(const char *s)переводит s в long; эквивалентна strtol(s, (char**) NULL, 10).double strtod(const char *s, char **endp)strtod преобразует первые символы строки s в double, игнорируя начальные символыразделители; запоминает указатель на непреобразованный конец в *endp (если endp не NULL), припереполнении она выдает HUGE_VAL с соответствующим знаком, в случае, если результатоказывается меньше, чем возможно представить данным типом, возвращается 0; в обоих случаях вerrno устанавливается ERANGE.long strtol(const char *s, char **endp, int base)strtol преобразует первые символы строки s в long, игнорируя начальные символы-разделители;запоминает указатель на непреобразованный конец в *endp (если endp не NULL).
Если baseнаходится в диапазоне от 2 до 36, то преобразование делается в предположении, что на входе —запись числа по основанию base. Если base равно нулю, то основанием числа считается 8, 10 или 16;число, начинающееся с цифры 0, считается восьмеричным, а с 0х или 0Х — шестнадцатеричным.Цифры от 10 до base-1 записываются начальными буквами латинского алфавита в любом регистре.При основании, равном 16, в начале числа разрешается помещать 0х или 0Х. В случае переполненияфункция возвращает LONG_MAX или LONG_MIN (в зависимости от знака), а в errno устанавливаетсяERANGE.unsigned long strtoul(const char *s, char **endp, int base)strtoul работает так же, как и strtol, с той лишь разницей, что возвращает результат типаunsigned long, а в случае переполнения — ULONG_MAX.int rand(void)rand выдает псевдослучайное число в диапазоне от 0 до RAND_MAX; RAND_MAX не меньше 32767.void srand(unsigned int seed)srand использует seed в качестве семени для новой последовательности псевдослучайных чисел.Изначально параметр seed равен 1.void *calloc(size_t nobj, size_t size)calloc возвращает указатель на место в памяти, отведенное для массива nobj объектов, каждый изкоторых размера size, или, если памяти запрашиваемого объема нет, NULL.
Выделенная областьпамяти обнуляется.void *malloc(size_t size)malloc возвращает указатель на место в памяти для объекта размера size или, если памятизапрашиваемого объема нет, NULL. Выделенная область памяти не инициализируется.void *realloc(void *p, size_t size)realloc заменяет на size размер объекта, на который указывает р. Для части, размер которойравен наименьшему из старого и нового размеров, содержимое не изменяется. Если новый размербольше старого, дополнительное пространство не инициализируется, realloc возвращает указательна новое место памяти или, если требования не могут быть удовлетворены, NULL (*p при этом неизменяется).void free(void *p)free освобождает область памяти, на которую указывает р; эта функция ничего не делает, если рравно NULL.
В р должен стоять указатель на область памяти, ранее выделенную одной из функций:calloc, malloc или realloc.void abort(void *p)abort вызывает аварийноеraise(SIGABRT).завершениепрограммы,еедействияэквивалентнывызовуvoid exit(int status)exit вызывает нормальное завершение программы. Функции, зарегистрированные с помощьюatexit, выполняются в порядке, обратном их регистрации. Производится опорожнение буферовоткрытых файлов, открытые потоки закрываются, и управление возвращается в среду, из которой былпроизведен запуск программы. Значение status, передаваемое в среду, зависит от реализации,однако при успешном завершении программы принято передавать нуль.
Можно также использоватьзначения EXIT_SUCCESS (в случае успешного завершения) и EXIT_FAILURE (в случае ошибки).int atexit(void (*fcn)(void))atexit регистрирует fcn в качестве функции, которая будет вызываться при нормальномзавершении программы; возвращает ненулевое значение, если регистрация не может бытьвыполнена.int system(const char *s)system передает строку s операционной среде для выполнения.
Если s есть NULL и существуеткомандный процессор, то system возвращает ненулевое значение. Если s не NULL, то возвращаемоезначение зависит от реализации.char *getenv(const char *name)getenv возвращает строку среды, связанную с name, или, если никакой строки не существует, NULL.Детали зависят от реализации.void *bsearch(const void *key, const void *base, size_t n, size_t size, int(*cmp)(const void *keyval, const void *datum))bsearch ищет среди base[0]...base[n-1] элемент с подходящим ключом *key. Функция cmpдолжна сравнивать первый аргумент (ключ поиска) со своим вторым аргументом (значением ключа втаблице) и в зависимости от результата сравнения выдавать отрицательное число, нуль илиположительное значение. Элементы массива base должны быть упорядочены в возрастающемпорядке, bsearch возвращает указатель на элемент с подходящим ключом или, если такого неоказалось, NULL.void qsort(void *base, size_t n, size_t size, int (*cmp)(const void *, constvoid *))qsort сортирует массив base[0]...base[n-1] объектов размера size в возрастающем порядке.Функция сравнения cmp — такая же, как и в bsearch.int abs(int n)abs возвращает абсолютное значение аргумента типа int.long labs(long n)labs возвращает абсолютное значение аргумента типа long.div_t div(int num, int denom)div вычисляет частное и остаток от деления num на denom.
Результаты типа int запоминаются вэлементах quot и rem структуры div_t.ldiv_t ldiv(long num, long denom)ldiv вычисляет частное и остаток от деления num на denom. Результаты типа long запоминаются вэлементах quot и rem структуры ldiv_t.В 6. Диагностика: <assert. h>Макрос assert используется для включения в программу диагностических сообщений.void assert (int выражение)Если выражение имеет значение нуль, тоassert (выражение)напечатает в stderr сообщение следующего вида:Assertion failed: выражение, file имя-файла, line nnnпосле чего будет вызвана функция abort, которая завершит вычисления.















