Работа со строками

Последнее обновление: 03.02.2023

Заголовочный файл string.h содержит ряд функций для работы со строками. Рассмотрим некоторые из них.

Длина строки. strlen

Функция 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

Для сравнения строк применяется функция 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

Функция 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

Функция 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

Функция 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;
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850