Menu
Coddy logo textTech

Podsumowanie: klasa opakowująca ciąg znaków

Część sekcji Programowanie obiektowe ścieżki C w Coddy. Lekcja 16 z 61.

challenge icon

Wyzwanie

Łatwy

Zbudujmy moduł StringObject, który opakowuje dynamicznie alokowaną tablicę znaków. To podsumowujące wyzwanie łączy cały cykl życia obiektu: konstruktor, metodę tylko do odczytu i destruktor, które współpracują ze sobą, aby bezpiecznie zarządzać pamięcią.

Utworzysz trzy pliki:

  • stringobj.h: Zadeklaruj strukturę StringObject z jednym polem: char *text (wskaźnikiem do dynamicznie alokowanego ciągu znaków). Zadeklaruj też trzy funkcje:
    • create_string: przyjmuje argument const char * i zwraca wskaźnik do nowo zaalokowanego obiektu StringObject
    • print_string: przyjmuje argument const StringObject * i wyświetla przechowywany tekst
    • free_string: przyjmuje argument StringObject * i zwalnia całą zaalokowaną pamięć
    Użyj strażników nagłówka z symbolem STRINGOBJ_H.
  • stringobj.c: Zaimplementuj wszystkie trzy funkcje. Konstruktor powinien zaalokować pamięć dla struktury, a następnie zaalokować pamięć dla tekstu (pamiętaj o strlen plus jednym miejscu na terminator null) i skopiować ciąg wejściowy. Destruktor musi zwalniać pamięć w odwrotnej kolejności: najpierw wewnętrzny bufor text, a następnie samą strukturę. Dla bezpieczeństwa uwzględnij sprawdzenie NULL w destruktorze.
  • main.c: Użyj swojego modułu, aby utworzyć obiekt ciągu znaków, wyświetlić jego zawartość, a następnie prawidłowo zwolnić pamięć.

Otrzymasz jedno wejście: ciąg tekstowy do przechowania w obiekcie StringObject.

W pliku głównym utwórz obiekt StringObject z podanym tekstem, wyświetl jego zawartość, zwolnij pamięć, a następnie wyświetl komunikat potwierdzający.

Funkcja print_string powinna wyświetlać tekst w tym formacie:

Text: {text}

Po zwolnieniu pamięci wyświetl:

Freed

Na przykład dla wejścia Hello World wynikiem byłoby:

Text: Hello World
Freed

Spróbuj swoich sił

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

int main() {
    char input[256];
    fgets(input, sizeof(input), stdin);
    
    // Usuń znak nowej linii, jeśli występuje
    int len = 0;
    while (input[len] != '\0') len++;
    if (len > 0 && input[len - 1] == '\n') {
        input[len - 1] = '\0';
    }
    
    // TODO: Utwórz StringObject z tekstu wejściowego
    
    // TODO: Wypisz ciąg znaków za pomocą print_string
    
    // TODO: Zwolnij StringObject za pomocą free_string
    
    // TODO: Wypisz "Freed", aby potwierdzić zwolnienie zasobów
    
    return 0;
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C online