netlib.narod.ru | < Назад | Оглавление | Далее > |
В стандартной библиотеке представлен широкий спектр различных функций. Настоящий параграф содержит краткий обзор наиболее полезных из них. Более подробно эти и другие функции описаны в приложении В.
Мы уже упоминали функции strlen, strcpy, strcat и strcmp, описания которых даны в <string.h>. Далее, до конца пункта, предполагается, что s и t имеют тип char *, c и n — тип int.
strcat(s, t) | приписывает t в конец s. |
strncat(s, t, n) | приписывает n символов из t в конец s. |
strcmp(s, t) | возвращает отрицательное число, нуль или положительное число для s < t, s == t и s > t соответственно. |
strncmp(s, t, n) | делает то же, что и strcmp, но количество сравниваемых символов не может превышать n. |
strcpy(s, t) | копирует t в s. |
strncpy(s, t, n) | копирует не более n символов из t в s. |
strlen(s) | возвращает длину s. |
strchr(s, c) | возвращает указатель на первое появление символа c в s или NULL, если c нет в s. |
strrchr(s, c) | возвращает указатель на последнее появление символа c в s или NULL, если c нет в s. |
Несколько функций из библиотеки <ctype.h> выполняют проверки и преобразования символов. Далее, до конца пункта, переменная c — это переменная типа int, которая может быть представлена значением unsigned char или EOF. Все эти функции возвращают значения типа int.
isalpha(c) | не нуль, если c — буква; 0 в противном случае. |
isupper(c) | не нуль, если c — буква верхнего регистра; 0 в противном случае. |
islower(c) | не нуль, если c — буква нижнего регистра; 0 в противном случае. |
isdigit(c) | не нуль, если c — цифра; 0 в противном случае. |
isalnum(с) | не нуль если истины isalpha(c) или isdigit(c); 0 в противном случае. |
isspace(c) | не нуль, если c — символ-разделитель (пробел, табуляция, символ новой строки, возврата каретки, перевода строки или вертикальной табуляции). |
toupper(c) | возвращает символ с преобразованный в символ верхнего регистра. |
tolower(c) | возвращает символ с преобразованный в символ нижнего регистра. |
В стандартной библиотеке содержится более ограниченная версия функции ungetch по сравнению с той, которую мы написали в главе 4. Называется она ungetc. Эта функция имеющая прототип
int ungetc(int c, FILE *fp)
отправляет символ c назад в файл fp и возвращает c, а в случае ошибки EOF. Для каждого файла гарантирован возврат не более одного символа. Функцию ungetc можно использовать совместно с любой из функций ввода вроде scanf, getc, getchar и т.д.
Функция system(char *s) выполняет команду системы, содержащуюся в строке s, и затем возвращается к выполнению текущей программы. Содержимое s, строго говоря, зависит от конкретной операционной системы. Рассмотрим простой пример: в системе UNIX инструкция
system("date");
вызовет программу date, которая направит дату и время в стандартный вывод. Функция возвращает зависящий от системы код завершения выполненой команды. В системе UNIX код завершения — это значение, переданное функцией exit.
Функции malloc и calloc динамически запрашивают блоки свободной памяти. Функция malloc
void *malloc(size_t n)
возвращает указатель на n байт неинициализированной памяти или NULL, если запрос удовлетворить нельзя. Функция calloc
void *calloc(size_t n, size_t size)
возвращает указатель на область, достаточную для хранения массива из n объектов указанного размера (size), или NULL, если запрос не удается удовлетворить. Выделенная память обнуляется.
Указатель, возвращаемый функциями malloc и calloc, будет выдан с учетом выравнивания, выполненного согласно указанному типу объекта. Тем не менее к нему должна быть применена операция приведения к соответствующему типу1, как это сделано в следующем фрагменте программы:
int *ip; ip = (int *)calloc(n, sizeof(int));
Функция free(p) освобождает область памяти, на которую указывает p, — указатель, первоначально полученный с помощью malloc или calloc. Никаких ограничений на порядок, в котором будет освобождаться память, нет, но считается ужасной ошибкой освобождение тех областей, которые не были получены с помощью calloc или malloc.
Нельзя также использовать те области памяти, которые уже освобождены. Следующий пример демонстрирует типичную ошибку в цикле, освобождающем элементы списка.
for (p = head; p != NULL; p = p->next) /* НЕВЕРНО */ fpee(p);
Правильным будет, если вы до освобождения сохраните то, что вам потребуется, как в следующем цикле:
for (p = head; p != NULL; p = q) { q = p->next; free(p); }
В параграфе 8.7 мы рассмотрим реализацию программы управления памятью вроде malloc, позволяющую освобождать выделенные блоки памяти в любой последовательности.
1 Как уже отмечалось (см. примечание на с. 183), замечание о приведении типов значений, возвращаемых функциями malloc или сalloc, неверно.
В <math.h> описано более двадцати математических функций. Здесь же приведены наиболее употребительные. Каждая из них имеет один или два аргумента типа double и возвращает результат также типа double.
Функция rand() вычисляет последовательность псевдослучайных целых в диапазоне от нуля до значения, заданного именованной константой RAND_MAX, которая определена в <stdlib.h>. Привести случайные числа к значениям с плавающей точкой в диапазоне от 0 до 1 можно по формуле:
#define frand() ((double)rand() / (RAND_MAX+1.0))
(Если в вашей библиотеке уже есть функция для получения случайных чисел с плавающей точкой, вполне возможно, что ее статистические характеристики лучше указанной.)
Функция srand(unsigned) устанавливает начальное значение для генератора случайных чисел. Реализации rand и srand, предлагаемые стандартом и, следовательно, переносимые на различные машины, рассмотрены в параграфе 2.7.
Упражнение 7-9 |
Реализуя функции вроде isupper, можно экономить либо память, либо время. Напишите оба варианта функции. |
netlib.narod.ru | < Назад | Оглавление | Далее > |