B Функции, оперирующие со строками: <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' и возвращается указатель на лексему. Каждый последующий вызов, в котором указатель s равен NULL, возвращает указатель на следующую лексему, которую функция будет искать сразу за концом предыдущей. Функция strtok возвращает NULL, если далее никакой лексемы не обнаружено. Параметр ct от вызова к вызову может варьироваться.
Здесь и ниже под такими выражениями как 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 |