Библиотека string.h предоставляет функции для работы со строками (zero-terminated strings) в си, а также несколько функций для работы с массивами, которые сильно упрощают жизнь. Рассмотрим функции с примерами.
- Копирование
- Конкатенация (склеивание)
- Сравнение
- Поиск
- Длина строки и заполнение символами
- Перевод строка-число и число-строка
- Форматированный ввод и вывод в буфер
- Работа с локалью
Копирование
void * memcpy (void * destination, const void * source, size_t num);
Копирует участок памяти из source в destination, размером num байт. Функция очень полезная, с помощью неё, например, можно скопировать объект или перенести участок массива, вместо поэлементного копирования. Функция производит бинарное копирование, тип данных не важен. Например, удалим элемент из массива и сдвинем остаток массива влево.
#include #include #include #define SIZE 10 int main() < int a[SIZE] = ; unsigned index; int i; printf(«Enter index [0 .. 9]»); scanf(«%ud», index = index < SIZE? index: SIZE-1; memcpy(a[index+1], sizeof(int) * (SIZE — index — 1)); for (i = 0; i < SIZE; i++) < printf(«%d «, a[i]); >getch(); >
Функция меняет местами две переменные
Язык Си с нуля — Урок 46 — Подробно про строки. Строковые литералы. Склеивание строк.
#include #include #include #include void swap(void* a, void* b, size_t size) < void *tmp = malloc(size); memcpy(tmp, a, size); memcpy(a, b, size); memcpy(b, tmp, size); free(tmp); >int main()
Здесь хотелось бы отметить, что функция выделяет память под временную переменную. Это дорогостоящая операция. Для улучшения производительности стоит передавать функции временную переменную, которая будет создана один раз.
#include #include #include #include void swap(void* a, void* b, void* tmp, size_t size) < memcpy(tmp, a, size); memcpy(a, b, size); memcpy(b, tmp, size); >int main()
void* memmove (void * destination, const void * source, size_t num);
Копирует блок памяти из source в destination размером num байт с той разницей, что области могут пересекаться. Во время копирования используется промежуточный буфер, который предотвращает перекрытие областей.
#include #include #include void main ()
char* strcpy (char * destination, const char* source );
Копирует одну строку в другую, вместе с нулевым символом. Также возвращает указатель на destination.
#include #include #include #include void main ()
Можно копировать и по-другому
#include #include #include #include void main ()
char* strncpy (char* destination, const char* source, size_t num);
Копирует только num первых букв строки. 0 в конец не добавляется автоматически. При копировании из строки в эту же строку части не должны пересекаться (при пересечении используйте memmove)
#include #include #include #include void main ()
Конкатенация строк
char* strcat (char * destination, const char * source);
Добавляет в конец destination строку source, при этом затирая первым символом нулевой. Возвращает указатель на destination.
Строки в языке программирования С++
char* strncat (char * destination, const char * source, size_t num);
Добавляет в конец строки destination num символов второй строки. В конец добавляется нулевой символ.
#include #include #include void main () < char a[255]; char b[128]; scanf(«%127s», a); scanf(«%127s», b); strncat(a, b, strlen(b)/2); printf(«%s», a); getch(); >
Сравнение строк
int strcmp (const char * str1, const char * str2);
Возвращает 0, если строки равны, больше нуля, если первая строка больше, меньше нуля, если первая строка меньше. Сравнение строк происходит посимвольно, сравниваются численные значения. Для сравнения строк на определённом языке используется strcoll
int strcoll (const char * str1, const char * str2);
int strncmp (const char * str1, const char * str2, size_t num);
сравнение строк по первым num символам
Пример — сортировка массива строк по первым трём символам
#include #include #include #include int cmp(const void *a, const void *b) < return strncmp((char*) a, (char*) b, 3); >void main() < char words[][128] = < «Solar», «Obscurus», «Tempestus», «Ultima», «Pacificus» >; int i; qsort(words, 5, 128, cmp); for (i = 0; i < 5; i++) < printf(«%sn», words[i]); >getch(); >
size_t strxfrm (char * destination, const char * source, size_t num);
Трансформация строки в соответствии с локалью. В строку destination копируется num трансформированных символов строки source и возвращается её длина. Если num == 0 и destination == NULL, то возвращается просто длина строки.
#include #include #include #include void main() < char input[128]; char output[128]; scanf(«%127s», input); //Выводи введённую строку printf(«%sn», input); //Проводим преобразование, ничего не меняется strxfrm(output, input, 128); printf(«%sn», output); //Изменяем локаль setlocale(LC_ALL, «.1251»); strxfrm(output, input, 128); printf(«%sn», output); getch(); >
Поиск
void* memchr (void * ptr, int value, size_t num);
Проводит поиск среди первых num байтов участка памяти, на который ссылается ptr, первого вхождения значения value, которое трактуется как unsigned char. Возвращает указатель на найденный элемент, либо NULL.
#include #include #include #include void main() < char str[] = «Hello World!»; char *ptr = NULL; ptr = (char*) memchr(str, ‘