0Pricing
C Academy · Урок

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 — локальная установка не требуется.

Все уроки этого курса

  1. strlen, strcpy, strcat
  2. strcmp и сравнение
  3. strtok и разбор на токены
  4. memcpy и memset
← Назад к C Academy