strlen, strcpy, strcat
Основные строковые функции
«strlen, strcpy, strcat» — бесплатный урок C Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C Academy содержит 4 уроков всего.
Строки в C
В C строка — это всего лишь массив элементов типа char, оканчивающийся специальным символом нулевого терминатора '\0'.
Функции из <string.h> используют этот терминатор, чтобы определить конец строки. Без него они прочитают данные за пределами массива.
#include <stdio.h>
int main(void) {
char name[] = "Alice";
printf("%s\n", name);
printf("Bytes used: %lu\n", sizeof(name));
return 0;
}Подключение string.h
Чтобы использовать функции для работы со строками, необходимо подключить заголовочный файл:
#include <string.h>
Это предоставляет функции strlen, strcpy, strcat, strcmp и другие.
#include <stdio.h>
#include <string.h>
int main(void) {
char greeting[] = "Hello";
printf("Length is %lu\n", strlen(greeting));
return 0;
}strlen: подсчёт символов
strlen возвращает количество символов до нулевого терминатора. Сам символ '\0' не учитывается.
Поэтому strlen("cat") возвращает 3, хотя массив занимает 4 байта.
#include <stdio.h>
#include <string.h>
int main(void) {
char word[] = "cat";
printf("strlen = %lu\n", strlen(word));
printf("sizeof = %lu\n", sizeof(word));
return 0;
}strlen имеет сложность O(n)
Поскольку строки в C не хранят длину отдельно, strlen проходит по каждому символу, пока не найдёт '\0'.
Поэтому эта операция имеет сложность O(n). Не вызывайте её многократно в условии цикла для длинных строк.
#include <stdio.h>
#include <string.h>
int main(void) {
char msg[] = "programming";
size_t len = strlen(msg);
for (size_t i = 0; i < len; i++) {
printf("%c", msg[i]);
}
printf("\n");
return 0;
}strcpy: копирование строк
Строки нельзя копировать с помощью =. Используйте strcpy(dest, src): эта функция копирует src в dest, включая нулевой терминатор.
Строка назначения должна быть достаточно большой, чтобы вместить исходную строку и терминатор.
#include <stdio.h>
#include <string.h>
int main(void) {
char src[] = "Hello";
char dest[20];
strcpy(dest, src);
printf("%s\n", dest);
return 0;
}Опасность переполнения буфера в strcpy
Если dest слишком мал, strcpy записывает данные за пределами буфера и повреждает память. Это классическая ошибка безопасности.
Предпочтительно использовать strncpy(dest, src, n), которая копирует не более n байт. Обратите внимание: strncpy может не добавить нулевой терминатор, если src слишком длинен.
#include <stdio.h>
#include <string.h>
int main(void) {
char src[] = "LongString";
char dest[5];
strncpy(dest, src, 4);
dest[4] = '\0';
printf("%s\n", dest);
return 0;
}strcat: объединение строк
strcat(dest, src) добавляет src в конец dest. Запись начинается с нулевого терминатора dest, а в конце добавляется новый.
dest уже должна быть допустимой строкой с достаточным количеством свободного места.
#include <stdio.h>
#include <string.h>
int main(void) {
char buffer[20] = "Hello, ";
strcat(buffer, "World");
printf("%s\n", buffer);
return 0;
}Пошаговое построение строк
Вы можете объединять вызовы strcpy и strcat, чтобы собирать строку по частям.
Всегда начинайте с инициализированного буфера, чтобы первый вызов strcat нашёл допустимый терминатор.
#include <stdio.h>
#include <string.h>
int main(void) {
char full[50];
strcpy(full, "Mr. ");
strcat(full, "John ");
strcat(full, "Smith");
printf("%s\n", full);
return 0;
}Более безопасное объединение с помощью strncat
strncat(dest, src, n) добавляет не более n символов из src, а затем всегда добавляет нулевой терминатор.
Это помогает предотвращать переполнения, когда длина источника неизвестна.
#include <stdio.h>
#include <string.h>
int main(void) {
char dest[16] = "Data: ";
char src[] = "1234567890";
strncat(dest, src, 5);
printf("%s\n", dest);
return 0;
}Возвращаемые значения
И strcpy, и strcat возвращают указатель на dest. Это позволяет вкладывать вызовы друг в друга, хотя такая запись может ухудшить читаемость.
strlen возвращает значение типа size_t, который является беззнаковым. Будьте осторожны при сравнении его со знаковыми целыми числами.
#include <stdio.h>
#include <string.h>
int main(void) {
char a[20] = "foo";
char b[] = "bar";
printf("%s\n", strcat(a, b));
return 0;
}Распространённая ошибка при выделении памяти
Частая ошибка — забыть добавить +1 для нулевого терминатора при расчёте размера буфера.
Для строки длиной n требуется n + 1 байт. Общая длина двух объединённых строк равна strlen(a) + strlen(b) + 1.
#include <stdio.h>
#include <string.h>
int main(void) {
char a[] = "abc";
char b[] = "de";
size_t needed = strlen(a) + strlen(b) + 1;
printf("Need %lu bytes\n", needed);
return 0;
}Быстрая проверка
Проверьте, насколько хорошо Вы понимаете длины строк.
Итоги
Вы изучили основные функции string.h:
- strlen подсчитывает символы до
'\0'(O(n)). - strcpy копирует строку; назначение должно иметь достаточный размер.
- strcat добавляет данные к существующей строке.
- Всегда оставляйте место для нулевого терминатора и для безопасности предпочитайте варианты
strn*.
Часто задаваемые вопросы
Урок «strlen, strcpy, strcat» бесплатный?
Да — полный текст урока «strlen, strcpy, strcat» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C Academy, подпишись на CoddyKit PRO. Курс C Academy содержит 4 уроков всего.
Чему я научусь в уроке «strlen, strcpy, strcat»?
Основные строковые функции Ты практикуешь C Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C Academy?
Предыдущий опыт не требуется. C Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «strlen, strcpy, strcat»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C Academy?
Да. Каждый урок C Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- strlen, strcpy, strcat
- strcmp и сравнение
- strtok и разбор на токены
- memcpy и memset