Menu
Coddy logo textTech

Повторение: String Wrapper

Часть раздела Object Oriented Programming путешествия по C на Coddy — урок 16 из 61.

challenge icon

Задание

Легко

Давайте создадим модуль StringObject, который оборачивает динамически выделенный массив символов. Эта задача на повторение объединяет полный жизненный цикл объекта — конструктор, метод только для чтения и деструктор — работающие вместе для безопасного управления памятью.

Вы создадите три файла:

  • stringobj.h: Объявите структуру StringObject с одним членом: char *text (указатель на динамически выделенную строку). Также объявите три функции:
    • create_string — принимает const char * в качестве входных данных и возвращает указатель на вновь выделенный StringObject
    • print_string — принимает const StringObject * и отображает сохраненный текст
    • free_string — принимает StringObject * и освобождает всю выделенную память
    Используйте include guards с символом STRINGOBJ_H.
  • stringobj.c: Реализуйте все три функции. Ваш конструктор должен выделить память для структуры, затем выделить память для текста (помните про strlen плюс один для нулевого терминатора) и скопировать входную строку. Ваш деструктор должен освобождать память в обратном порядке — сначала внутренний буфер text, затем саму структуру. Включите проверку на NULL в деструктор для безопасности.
  • main.c: Используйте ваш модуль для создания строкового объекта, отображения его содержимого, а затем правильной очистки.

Вы получите одни входные данные: текстовую строку для хранения в вашем StringObject.

В вашем основном файле создайте StringObject с предоставленным текстом, выведите его содержимое, освободите память, а затем выведите подтверждающее сообщение.

Функция print_string должна выводить данные в следующем формате:

Text: {text}

После освобождения памяти выведите:

Freed

Например, при вводе Hello World вывод будет следующим:

Text: Hello World
Freed

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

#include <stdio.h>
#include "stringobj.h"

int main() {
    char input[256];
    fgets(input, sizeof(input), stdin);
    
    // Удалить символ новой строки, если он есть
    int len = 0;
    while (input[len] != '\0') len++;
    if (len > 0 && input[len - 1] == '\n') {
        input[len - 1] = '\0';
    }
    
    // TODO: Создать StringObject с введенным текстом
    
    // TODO: Вывести строку, используя print_string
    
    // TODO: Освободить StringObject, используя free_string
    
    // TODO: Вывести "Freed" для подтверждения очистки
    
    return 0;
}

Все уроки раздела Object Oriented Programming