Menu
Coddy logo textTech

Costruttore di stringhe dinamico

Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 59 di 61.

challenge icon

Sfida

Facile

Costruiamo uno StringBuilder: un contenitore di stringhe dinamico che cresce automaticamente quando aggiungi testo. È un’utilità pratica che combina la gestione dinamica della memoria con i modelli OOP che hai imparato durante questo corso.

Organizzerai il codice in tre file:

  • stringbuilder.h: dichiara la struct StringBuilder con tre membri: un buffer char*, un size_t per la lunghezza corrente e un size_t per la capacità totale. Dichiara i prototipi delle funzioni per creare uno StringBuilder, aggiungervi testo, recuperare la stringa finale e liberare la memoria. Le protezioni dalle inclusioni multiple sono essenziali.
  • stringbuilder.c: implementa il sistema StringBuilder:
    • create_stringbuilder: alloca uno StringBuilder nell'heap, inizializza il buffer con una capacità iniziale di 16 byte, imposta la lunghezza a 0 e assicura che il buffer inizi come stringa vuota (terminata da null)
    • append: accetta un puntatore a uno StringBuilder e una stringa da aggiungere. Calcola la nuova lunghezza richiesta. Se supera la capacità, raddoppia la capacità (ripetutamente, se necessario) e usa realloc per espandere il buffer. Quindi concatena il nuovo testo usando strcat
    • get_string: restituisce un puntatore al buffer interno (accesso in sola lettura)
    • free_stringbuilder: libera prima il buffer, quindi la struct StringBuilder stessa
  • main.c: leggi un intero che indica quante stringhe aggiungere. Poi leggi ogni stringa usando fgets e aggiungila al tuo StringBuilder. Dopo aver aggiunto tutte le stringhe, stampa la stringa completa assemblata usando get_string. Infine, libera lo StringBuilder.

Due funzioni chiave usate in questa sfida:

  • realloc(ptr, new_size): ridimensiona un blocco di memoria allocato in precedenza. Accetta un puntatore al blocco esistente e la nuova dimensione desiderata in byte e restituisce un puntatore al blocco ridimensionato (che potrebbe essere stato spostato). Usala in append quando il buffer deve crescere:
    sb->buffer = (char*)realloc(sb->buffer, sb->capacity);
  • fgets(buffer, size, stream): legge una riga di testo da un flusso di input in un array di caratteri, fermandosi al carattere di nuova riga o dopo aver letto size - 1 caratteri. Mantiene il carattere di nuova riga nel buffer, quindi dovrai rimuoverlo manualmente. Usala in main.c per leggere ogni stringa di input:
    fgets(line, sizeof(line), stdin);
    Per rimuovere il carattere di nuova riga finale: controlla se l'ultimo carattere è '\n' e sostituiscilo con '\0'.

Il tuo programma riceverà:

  1. Il numero di stringhe da aggiungere
  2. Ogni stringa su una riga separata

Esempio di output quando gli input sono 3, poi Hello, , World:

Hello World

Esempio di output quando gli input sono 4, poi C, is, a, great language!:

C is a great language!

Esempio di output quando l'input è 1, poi SingleString:

SingleString

Ricorda di aggiornare il campo length dopo ogni operazione di aggiunta. Quando controlli se è necessaria una riallocazione, tieni conto del terminatore null: il buffer deve avere spazio per length + new_text_length + 1 byte. Usa strlen da <string.h> per misurare la lunghezza delle stringhe. Inoltre, chiama getchar() dopo scanf in main.c per consumare il carattere di nuova riga residuo prima di leggere le stringhe con fgets.

Provalo tu

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

int main() {
    int n;
    scanf("%d", &n);
    getchar(); // consuma il carattere di nuova riga dopo il numero
    
    // TODO: Crea un StringBuilder usando create_stringbuilder()
    
    // TODO: Leggi n stringhe e aggiungi ciascuna al StringBuilder
    // Suggerimento: usa fgets o una funzione simile per leggere ogni riga
    // Ricorda di gestire il carattere di nuova riga prodotto da fgets, se lo usi
    
    // TODO: Stampa la stringa completa assemblata usando get_string()
    
    // TODO: Libera il StringBuilder usando free_stringbuilder()
    
    return 0;
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore C online