Menu
Coddy logo textTech

Динамический построитель строк

Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 59 из 61.

challenge icon

Задание

Легко

Давайте создадим StringBuilder: динамический контейнер строк, который автоматически увеличивается при добавлении текста. Это практическая утилита, объединяющая управление динамической памятью с шаблонами ООП, которые вы освоили на протяжении этого курса.

Вы организуете код в трёх файлах:

  • stringbuilder.h: Declare структуру StringBuilder с тремя членами: буфером char*, типом size_t для текущей длины и типом size_t для общей capacity. Declare прототипы functions для создания StringBuilder, добавления текста, получения итоговой строки и освобождения памяти. Защитные макросы включения обязательны.
  • stringbuilder.c: Implement систему StringBuilder:
    • create_stringbuilder: выделяет StringBuilder в heap, инициализирует buffer с начальной capacity 16 bytes, устанавливает length в 0 и гарантирует, что buffer начинается с empty string (завершается нулевым символом)
    • append: принимает указатель на StringBuilder и строку для добавления. Calculate новую требуемую длину. Если она exceeds capacity, удвойте capacity (повторяйте при необходимости) и используйте realloc, чтобы grow buffer. Затем concatenate новый текст с помощью strcat
    • get_string: возвращает указатель на internal buffer (доступ только для чтения)
    • free_stringbuilder: сначала освобождает buffer, затем саму структуру StringBuilder
  • main.c: Прочитайте целое число, обозначающее, сколько строк нужно добавить. Затем прочитайте each строку с помощью fgets и добавьте её в StringBuilder. После добавления всех строк выведите complete assembled string с помощью get_string. Наконец, освободите StringBuilder.

Two key functions used in this challenge:

  • realloc(ptr, new_size): изменяет размер ранее выделенного блока памяти. Она принимает указатель на существующий блок и новый желаемый размер в bytes и возвращает указатель на изменённый блок (который, возможно, был перемещён). Используйте её в append, когда buffer нужно grow:
    sb->buffer = (char*)realloc(sb->buffer, sb->capacity);
  • fgets(buffer, size, stream): считывает строку текста из входного потока в массив символов, останавливаясь на символе новой строки или после чтения size - 1 символов. Она сохраняет символ новой строки в buffer, поэтому его нужно удалить вручную. Используйте её в main.c, чтобы прочитать each входную строку:
    fgets(line, sizeof(line), stdin);
    Чтобы удалить завершающий символ новой строки: проверьте, является ли последний character '\n', и замените его на '\0'.

Ваша программа получит:

  1. Количество строк для добавления
  2. Каждую строку в отдельной строке

Пример вывода, если входные данные: 3, затем Hello, , World:

Hello World

Пример вывода, если входные данные: 4, затем C, is, a, great language!:

C is a great language!

Пример вывода, если входные данные: 1, затем SingleString:

SingleString

Не забудьте обновлять поле length после каждой операции append. Проверяя, требуется ли перераспределение памяти, учитывайте нулевой терминатор: buffer должен иметь место для length + new_text_length + 1 bytes. Используйте strlen из <string.h>, чтобы измерять длину строк. Также вызовите getchar() после scanf в main.c, чтобы consume оставшийся символ новой строки перед чтением строк с помощью fgets.

Попробуйте сами

#include <stdio.h>
#include <stdlib.h>
#include "stringbuilder.h"

int main() {
    int n;
    scanf("%d", &n);
    getchar(); // поглотить символ новой строки после числа
    
    // TODO: Create a StringBuilder using create_stringbuilder()
    
    // TODO: Read n strings and append each to the StringBuilder
    // Подсказка: Используйте fgets или аналогичную функцию для чтения каждой строки
    // Не забудьте обработать символ новой строки из fgets, если вы его используете
    
    // TODO: Выведите полную собранную строку с помощью get_string()
    
    // TODO: Free the StringBuilder using free_stringbuilder()
    
    return 0;
}

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор C