|
|||
Функции стандартной библиотеки для работы со строками в стиле С (заголовочный файл string.h).Функции стандартной библиотеки для работы со строками в стиле С (заголовочный файл string.h). Нахождение первого вхождения символа в блок памяти void *memchr(const void *p, int ch, size_t n); Возвращает указатель на первое вхождение байта, представленного младшим байтом аргумента ch в блоке памяти р длиной n. Тип size_t (заголовочный файл <stdio.h>) является беззнаковым целочисленным типом, используемым для представления результата операции sizeof. Этот тип не может быть длиннее, чем unsigned long. Сравнение блоков памяти int memcmp(const void *p1, const void *p2, size_t n); Сравнивает два блока памяти и возвращает значение: меньше нуля, равное нулю или больше нуля — аналогично кодам возврата функции strcmp. Копирование блоков памяти void *memcpy(void *dest, const void *src, size_t n); Копирует блок памяти длиной n байт из адреса src по адресу dest. void *memmove( void *dest, const void *src, size_t n); Функция аналогична memcpy, но блоки dest и src могут перекрываться. Заполнение блока памяти символами void *memset(const void *p, int ch, size_t n); Заполняет блок памяти символом, взятым из младшего байта ch. Сложение строк char *strcat(char *s1, char *s2); Добавляет s2 к s1 и возвращает s1. В конец результирующей строки добавляется нуль-символ. Поиск символа в строке char *strchr(char *s, int ch); Возвращает указатель на первое вхождение символа ch в строку s, если его нет, то возвращается NULL. Сравнение строк int *strcmp(char *s1, char *s2); Сравнивает строки и возвращает отрицательное (если s1 меньше s2), нулевое (если s1 равно s2) или положительное (если s1 больше s2) значение. char *strcoll(char *sl, char *s2); Cравнивает строки аналогично strcmp, но учитывает установки локализации (информацию, зависящую от страны). Копирование строк char *strcpy(char *sl, char *s2); Функция копирует s2 в s1 и возвращает s1. Поиск символов одной строки в другой size_t strcspn(char *sl, char *s2); Возвращает значение индекса любого из символов из s2 в строке s1. Поиск строки с описанием ошибки char *strerror(size_t n); Возвращает указатель на строку с описанием ошибки номер n. Определение длины строки size_t strlen(char *s); Функция возвращает длину строки (без учета нуль-символа). Сложение строки с несколькими символами другой строки char *strncat(char *sl, char *s2, size_t n); Функция добавляет не более n символов из s2 к s1 и возвращает s1. Первый символ s2 пишется на место завершающего нуль-символа строки s1. Если длина строки s2 меньше n, переписываются все символы s2. К строке s1 добавляется нуль-символ. Если строки перекрываются, поведение не определено. Сравнение строки с несколькими символами другой строки int strcmp(char *sl, char *s2, size_t n); Сравнивает s1 и первые n символов s2 и возвращает отрицательное (если s1 меньше s2), нулевое (если s1 равно s2) или положительное (если s1 больше s2) значение. Копирование нескольких символов одной строки в другую char *strncpy(char *sl, char *s2, size_t n); Копирует не более n символов из s2 в s1 и возвращает s1. Если длина исходной строки превышает или равна т, нуль-символ в конец строки s1 не добавляется. В противном случае строка дополняется нуль-символами до n-го символа. Если строки перекрываются, поведение не определено. Поиск одного из символов строки в другой строке char *strpbrk(char *sl, char *s2); Возвращает указатель на символ, являющийся первым вхождением любого из символов из s2 в строку s1, если его нет, возвращается NULL. Поиск символа в строке char *strrchr(char *s, int ch); Возвращает указатель на первое вхождение символа ch в строку s справа, если его нет, возвращает NULL. Поиск символа строки, отсутствующего в другой size_t strspn(char *sl, char *s2); Возвращает индекс первого символа в s1, отсутствующего в s2. Поиск подстроки в строке shar *strstr(char *sl, char *s2); Выполняет поиск первого вхождения подстроки s2 в строку s1. В случае удачного поиска, возвращает указатель на элемент из s1, с которого начинается s2, и NULL в противном случае. Выделение лексем из строки char *strtok(char *s1, char *s2); Возвращает следующую лексему из s1, отделенную любым из символов из набора s2. Преобразование строк на основе текущей локализации. size_t strxfrm(char *s1, char *s2, size_t n); Преобразует строку из s2 и помещает ее в s1 на основе текущей локализации. Преобразуется не более n символов. Функции для работы с многобайтовыми символами Для работы с многобайтными символами (типа wchar_t) предназначены функции: wsstrcat, wcscol1, wcscpy, wcscspn, wcslen, wcsncat, wcsncmp, wcsncpy, wcspbrk, wcsrchr, wcsspn, wcsstr, wcstok, wcstrxfrm, wmemcpy, wmemmove, wmemset. Данные функции аналогичны функциям для работы с символами типа char. Например, функция сложения строк wsccat имеет формат, аналогичный формату функции strcat, и отличается только типом аргументов и возвращаемого значения: wchar_t *wcscat(wchar_t *s1, wchar_t *s2); Функция добавляет s2 к s1 и возвращает s1. Пример: запрос пароля пароль не более трех раз. #include <stdio.h> #include <string.h> int main( ){ char s[80], passw[] = "kuku"; // passw - эталонный пароль. // Можно записать как *passw = "kuku"; int i, k = 0; for (i = 0; !k && i<3; i++){ printf("\nВведите пароль;\n"); gets(s); if (strstr(s,passw)) k = 1; //сравнение строк } if (k) printf("\nпapoль принят"); else printf("\nпapoль не принят"); return 0; } Распространенные ошибки при работе со строками — отсутствие нуль-символа и выход указателя при просмотре строки за ее пределы. Пример: копирование строки src в строку dest. Очевидный алгоритм решения задачи имеет вид: char src[10], dest[10]; for (int i = 0; i<=strlen(src); i++) dest[i] = src[i]; Функция strlen вычисляет длину строки, выполняя поиск нуль-символа. Таким образом, строка фактически просматривается дважды. Более эффективным будет использовать проверку на нуль-символ непосредственно в программе. Увеличение индекса можно заменить инкрементом указателей (для этого память под строку src должна выделяться динамически, а также требуется определить дополнительный указатель и инициализировать его адресом начала строки dest): #include <iostream.h> int main( ){ char *src = new char [10]; char *dest = new char [10], *d=dest; cin >> src; while ( *src!= 0) *d++ = *src++; *d = 0; // завершающий нуль cout << dest; return 0; } В цикле производится посимвольное присваивание элементов строк с одновременной инкрементацией указателей. Результат операции присваивания — передаваемое значение, которое, проверяется в условии цикла, поэтому можно поставить присваивание на место условия, а проверку на неравенство нулю опустить (при этом завершающий нуль копируется в цикле, и отдельного оператора для его присваивания не требуется). В результате цикл копирования строки принимает вид: while ( *d++ = *src++); Оба способа работы со строками (через массивы или указатели) приемлемы и имеют свои плюсы и минусы, но в общем случае лучше, пользоваться функциями библиотеки или определенным в стандартной библиотеке C++ классом string.
|
|||
|