Заголовочный файл string.h содержит ряд функций для работы со строками. Рассмотрим некоторые из них.
Функция strlen() возвращает количество символов строки (без учета концевого нулевого байта). Функция имеет следующее описание:
sizet_t strlen (const char* str);
То есть в качестве параметра принимает строку, длину которой надо найти. А результатом является значение size_t
- данный тип представляет целое положительное число,
который определен специально для представления размера.
Найдем длину строки:
#include <stdio.h> #include <string.h> int main(void) { const char str[] = "Hello"; size_t length = strlen(str); printf("String length: %zu \n", length); // String length: 5 return 0; }
Для вывода на консоль значения size_t
применяется спецификатор %zu
.
Для сравнения строк применяется функция strcmp(), которая имеет следующий прототип:
int strcmp (const char* str1, const char* str2);
Функция принимает две строки и посимвольно сравнивает их. Результатом функции является целое число. Функция посимвольно сравнивает строки, и . . Если
если строки равны, то возвращается 0
Если первый несовпадающий символ первой строки идет в лексикографическом порядке до символа второй строки, то возвращается число меньше 0
Если первый несовпадающий символ первой строки идет в лексикографическом порядке после символа второй строки, то возвращается число больше 0
Сравним пару строк:
#include <stdio.h> #include <string.h> int main(void) { const char *str1 = "Hello"; const char *str2 = "Hello"; int result = strcmp(str1, str2); if (result == 0) { printf("Strings are equal \n"); } else { printf("Strings are not equal \n"); } return 0; }
Функция strcat объединяет две строки в одну. Она имеет следующий прототип:
char *strcat(char *destination_str, const char *source_str);
Функция добавляет строку source_str
к строке destination_str
. При этом первая строка должна быть достаточно большая, чтобы вместить вторую строку:
#include <stdio.h> #include <string.h> int main(void) { char destination[30] = "Hello "; char source[30] = "METANIT.COM"; strcat(destination, source); printf("%s\n", destination); // Hello METANIT.COM return 0; }
Функция strcpy копирует символы из одной строки в другую. Она имеет следующий прототип:
char *strcpy(char *destination_str, const char *source_str);
Функция копирует символы из строки source_str
в destination_str
. При этом первая строка должна иметь достаточную длину, чтобы вместить вторую.
Скопируем символы из одной строки во вторую:
#include <stdio.h> #include <string.h> int main(void) { char destination[20]; char source[20] = "Hello METANIT.COM!"; strcpy(destination, source); printf("%s\n", destination); // Hello METANIT.COM return 0; }
Стоит отметить, что эта функция копирует символы из source в destination, пока не встретит нулевой байт \0. Теоретически это может приводить к переполнению буфера. И для избежания этой проблемы есть другая функция - strncpy, которая в качестве третьего параметра принимает количество копируемых символов:
#include <stdio.h> #include <string.h> int main(void) { char destination[20]; char source[20] = "Hello METANIT.COM!!"; int n = 20; // количество копируемых символов strncpy(destination, source, 20); destination[n-1] = '\0'; printf("%s\n", destination); // Hello METANIT.COM return 0; }
Однако функция strncpy имеет другую проблему - скопированная строка НЕ заканчивается нулевым байтом, что опять же в будущем может привести к переполению буфера. Поэтому после копирования следует вручную устанавливать нулевой байт:
destination[n-1] = '\0';
Кроме того, можно использовать функцию strncpy_s, которая считается более безопасной:
errno_t strncpy_s(char * destination, size_t destmax, const char * source, size_t srcmax);
Эта функция принимает дополнительные параметры - destmax
- максимальное количество копируемых символов в буфер destination и srcmax
-
максимальное количество копируемых символов из строки source. В качестве результата функция возвращает информацию об ошибке:
#include <stdio.h> #include <string.h> int main(void) { char destination[20]; char source[] = "Hello METANIT.COM!"; int n = 20; // количество копируемых символов strncpy_s(destination, n, source, n); printf("%s\n", destination); // Hello METANIT.COM return 0; }
Функция strstr ищет в строке определенную подстроку. Она имеет следующий прототип:
char *strstr(const char* string, const char* substring);
Функция ищет подстроку substring
в строке string
и возвращает указатель на символ первого вхождения подстроки, то есть по сути адрес подстроки.
Если от адреса первого символа строки вычесть адрес первого входжения подстроки, то мы получим индекс подстроки в строке:
#include <stdio.h> #include <string.h> int main(void) { char text[20] = "Hello METANIT.COM!"; char substring[14] = "METANIT.COM"; char *substring_ptr = strstr(text, substring); // если подстрока найдена if(substring_ptr) { // вычисляем позицию подстроки в строке long position = substring_ptr - text; printf("Substring index: %ld\n", position); // Substring index: 6 } else // если подстрока не найдена { printf("Substring not found\n"); } return 0; }