Динамический построитель строк
Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 59 из 61.
Задание
ЛегкоДавайте создадим 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 новый текст с помощьюstrcatget_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'.
Ваша программа получит:
- Количество строк для добавления
- Каждую строку в отдельной строке
Пример вывода, если входные данные: 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;
}
Все уроки раздела Объектно-ориентированное программирование
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация кругаРеализация прямоугольникаПолиморфное использованиеКонтейнер фигурПотренируйтесь самостоятельно: Онлайн-компилятор C