Язык программирования Си. Издание 3-е, исправленное
Шрифт:
B3. Функции, оперирующие со строками: <string.h>
Имеются две группы функций, оперирующих со строками. Они определены в заголовочном файле <string.h>. Имена функций первой группы начинаются с букв str, второй - с mem. Если копирование имеет дело с объектами, перекрывающимися по памяти, то, за исключением memmove, поведение функций не определено. Функции сравнения рассматривают аргументы как массивы элементов типа unsigned char.
В таблице на с. 321 переменные s и t принадлежат типу char *, cs и ct – типу const char *, n– типу size_t, а c– значение типа int, приведенное к типу char.
Последовательные вызовы strtok разбивают строку s на лексемы. Ограничителем лексемы служит любой символ из строки ct. В первом вызове указатель s не равен NULL. Функция находит в строке s первую лексему, состоящую из символов, не входящих в ct; ее работа заканчивается тем, что поверх следующего символа пишется '\0' и возвращается указатель на лексему. Каждый
Здесь и ниже под такими выражениями как cs<ct не следует понимать арифметическое сравнение указателей. Подразумевается лексикографическое сравнение, т. е. cs меньше (больше) ct, если первый несовпавший элемент в cs арифметически меньше (больше) соответствующего элемента из ct.— Примеч. ред.
char *strcpy(s,ct) | копирует строку ct в строку s, включая '\0'; возвращает s |
char *strncpy(s,ct,n) | копирует не более n символов строки ct в s; возвращает s. Дополняет результат символами '\0', если символов в ct меньше n |
char *strcat(s,ct) | приписывает ct к s; возвращает s |
char *strncat(s,ct,n) | приписывает не более n символов ct к s, завершая s символом '\0'; возвращает s |
char strcmp(cs,st) | сравнивает cs и ct; возвращает <0, если cs<ct; 0, если cs==ct; и >0, если cs>ct (I.B.: вообще-то, функция возвращает int) |
char strncmp(cs,ct) | сравнивает не более n символов cs и ct; возвращает <0, если cs<ct, 0, если cs==ct, и >0, если cs>ct (I.B.: тоже int должна возвращать) |
char *strchr(cs,c) | возвращает указатель на первое вхождение c в cs или, если такового не оказалось, NULL |
char *strrchr(cs,c) | возвращает указатель на последнее вхождение c в cs или, если такового не оказалось, NULL |
size_t strspn(cs,ct) | возвращает длину начального сегмента cs, состоящего из символов, входящих в строку ct |
size_t strcspn(cs,ct) | возвращает длину начального сегмента cs, состоящего из символов, не входящих в строку ct |
char *strpbrk(cs,ct) | возвращает указатель в cs на первый символ, который совпал с одним из символов, входящих в ct, или, если такового не оказалось, NULL |
char *strstr(cs, ct) | возвращает указатель на первое вхождение ct в cs или, если такового не оказалось, NULL |
size_t strlen(cs) | возвращает длину cs |
char * strerror(n) | возвращает указатель на зависящую от реализации строку, соответствующую номеру ошибки n |
char * strtok(s, ct) | strtok ищет в s лексему, ограниченную символами из ct; более подробное описание этой функции см. ниже |
Функции mem... предназначены для манипулирования с объектами как с массивами символов; их назначение - получить интерфейсы к эффективным программам. В приведенной ниже таблице s и t принадлежат типу void *; cs и ct– типу const void *; n– типу size_t; а c имеет значение типа int, приведенное к типу char.
void *memcpy(s,ct, n) | копирует n символов из ct в s и возвращает s |
void *memmove(s,ct,n) | делает то же самое, что и memcpy, но работает и в случае "перекрывающихся" объектов. |
int memcmp(cs, ct, n) | сравнивает первые n символов cs и ct; выдает тот же результат, что и функция strcmp |
void *memchr(cs, c, n) | возвращает указатель на первое вхождение символа c в cs или, если среди первых n символов c не встретилось, NULL |
void *memset(s, c, n) | размещает символ c в первых n позициях строки s и возвращает s |
B4. Математические функции: <math.h>
В заголовочном файле <math.h> описываются математические функции и определяются макросы.
Макросы EDOM и ERANGE (находящиеся в <errno.h>) задают отличные от нуля целочисленные константы, используемые для фиксации ошибки области и ошибки диапазона; HUGE_VAL определена как положительное значение типа double. Ошибка области возникает, если аргумент
sin(x) | синус x |
cos(x) | косинус x |
tan(x) | тангенс x |
asin(x) | арксинус x в диапазоне [-pi/2,pi/2], x в диапазоне [-1,1] |
acos(x) | арккосинус x в диапазоне [0, pi], x в диапазоне [-1,1] |
atan(x) | арктангенс x в диапазоне [-pi/2, pi/2] |
atan2(y,x) | арктангенс y/x в диапазоне [-pi, pi] |
sinh(x) | гиперболический синус x |
cosh(x) | гиперболический косинус x |
tanh(x) | гиперболический тангенс x |
exp(x) | Экспоненциальная функция ex |
log(x) | натуральный логарифм ln(x), x > 0 |
log10(x) | десятичный логарифм lg(x), x > 0 |
pow(x,y) | xy, ошибка области, если x = 0 или y<=0 или x<0 и y – не целое |
sqrt(x) | квадратный корень x, x >= 0 |
ceil(x) | наименьшее целое в виде double, которое не меньше x |
floor(x) | наибольшее целое в виде double, которое не больше x |
fabs(x) | абсолютное значение |x| |
ldexp(x, n) | x * 2n |
frexp(x, int *еxр) | разбивает x на два сомножителя, первый из которых - нормализованная дробь в интервале [1/2, 1), которая возвращается, а второй - степень двойки, эта степень запоминается в *exp. Если x– нуль, то обе части результата равны нулю |
modf(x,double *ip) | разбивается на целую и дробную части, обе имеют тот же знак, что и x. Целая часть запоминается в *ip, дробная часть выдается как результат |
fmod(x, y) | остаток от деления x на y в виде числа с плавающей точкой. Знак результата совпадает со знаком x. Если y равен нулю, результат зависит от реализации |
B5. Функции общего назначения: <stdlib.h>
Заголовочный файл <stdlib.h> объявляет функции, предназначенные для преобразования чисел, запроса памяти и других задач.
atof переводит s в double; эквивалентна strtod(s, (char**) NULL).
atoi переводит s в int; эквивалентна (int)strtol(s, (char**)NULL, 10).
atol переводит s в long; эквивалентна strtol(s, (char**) NULL, 10).
strtod преобразует первые символы строки s в double, игнорируя начальные символы-разделители; запоминает указатель на непреобразованный конец в *endp (если endp не NULL), при переполнении она выдает HUGE_VAL с соответствующим знаком, в случае, если результат оказывается меньше, чем возможно представить данным типом, возвращается 0; в обоих случаях в errno устанавливается ERANGE.
strtol преобразует первые символы строки s в long, игнорируя начальные символы-разделители; запоминает указатель на непреобразованный конец в *endp (если endp не NULL). Если base находится в диапазоне от 2 до 36, то преобразование делается в предположении, что на входе - запись числа по основанию base. Если base равно нулю, то основанием числа считается 8, 10 или 16; число, начинающееся с цифры 0, считается восьмеричным, а с 0x или 0X - шестнадцатеричным. Цифры от 10 до base-1 записываются начальными буквами латинского алфавита в любом регистре. При основании, равном 16, в начале числа разрешается помещать 0x или 0X. В случае переполнения функция возвращает LONG_MAX или LONG_MIN (в зависимости от знака), a в errno устанавливается ERANGE.