Операции со строками Создание строк
Проиллюстрируем создание строк на фрагментах кода с комментариями.
char str1[10]; // Строка - массив из 10 символов. Начальное значение символов не определено. char str2[10]="Hello"; /* Используется инициализация (не присваивание!). В первые 5 символов записывается “Hello”, в 6 – нуль-терминатор, значение трех последних не определено.*/ char str3[10]={'H', 'e', 'l', 'l', 'o', '\0'}; //Эквивалентно предыдущему. char str4[10]="Very long line"; //Ошибка. Массив из 10 элементов нельзя инициировать более длинной последовательностью. char str5[]="Very long line"; /*Компилятор автоматически определяет длину массива (в нашем случае 15) и инициализирует его последовательностью символов. */ char* str6; /*Строка - указатель на символ. В большинстве случаев для ее использования потребуется выделить память. Например, так char *s; s = new char[10];*/
|
Длина строки
Для вычисления длины строки используется функция (заголовочный файл <string.h>):
size_t strlen(const char *string); |
Функция возвращает длину строки, не включая нуль-терминатор. Как всегда, следите за тем, чтобы в выделенной памяти все же нашелся такой символ. В противном случае функция выйдет за пределы выделенной памяти и все будет плохо. Напомню, что для определения длины строки функции придется последовательно обратиться ко всем ее символам до нуль-терминатора, а значит, потенциально эта операция довольно дорогая. Поэтому, не следует использовать эту функцию в циклах, то есть, вместо
for (i=0;i<strlen(str);i++) { // работа со строкой, не изменяющая ее длину } |
больше подойдет примерно такой код :
char len; len=strlen(str); for (i=0;i<len;i++) { // работа со строкой, не изменяющая ее длину } |
Упражнение 1. Инициализируйте несколько строк разными способами, определите и напечатайте их размер, используя функцию sizeof() и strlen(). Объясните, чем определяется разница между полученными значениями. Упражнение 2. Проверьте, является ли данная строка палиндромом. |
Конкатенация (сцепление) строк
Сначала простой вопрос – каков результат выполнения следующего кода:
char str1[10]="Hello"; char str2[10]="World!"; char* str3; str3=str1+str2; |
Если ответ – ошибка в 4-й строке, вы усвоили материал (или знали это раньше). Если же вы полагаете, что в str3 будет храниться строка "Hello world!", то вероятно, предыдущих объяснений оказалось недостаточно.
Для конкатенации следует использовать функции.
Есть две специальные функции:
char* strcat(char* dest, const char* source) char* strncat(char* dest, const char* source, size_t size) |
Эти функции добавляют к строке, на которую указывает dest, символы из строки source. Первая версия добавляет все символы до нуль-терминатора, вторая – максимум size символов. Результирующая строка завершается нуль-терминатором.
