Costruttore di stringhe dinamico
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 59 di 61.
Sfida
FacileCostruiamo 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 structStringBuildercon tre membri: un bufferchar*, unsize_tper la lunghezza corrente e unsize_tper 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 usareallocper espandere il buffer. Quindi concatena il nuovo testo usandostrcatget_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 usandofgetse aggiungila al tuo StringBuilder. Dopo aver aggiunto tutte le stringhe, stampa la stringa completa assemblata usandoget_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 inappendquando 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 lettosize - 1caratteri. Mantiene il carattere di nuova riga nel buffer, quindi dovrai rimuoverlo manualmente. Usala inmain.cper 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à:
- Il numero di stringhe da aggiungere
- Ogni stringa su una riga separata
Esempio di output quando gli input sono 3, poi Hello, , World:
Hello WorldEsempio 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:
SingleStringRicorda 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
1Basi di programmazione modulare
File di intestazioneGuardie di inclusioneFile sorgenteFunzioni staticheRipasso: calcolatrice modulare4Incapsulamento
Il concetto di puntatori opachiDefinire struct opacheGetter e setterLa convalida nei setterRiepilogo: scatola segreta2Oggetti e metodi
Le struct come oggettiIl puntatore 'Self'Correttezza constPuntatore o valoreMetodi di supportoRiepilogo: gestore di punti5Progetto: Conto bancario semplice
Configurazione del progettoImplementazione del conto8Polimorfismo
Puntatori a funzione nelle structSimulare i metodiIl concetto di interfacciaImplementare le interfacceIterazione polimorficaRiepilogo: Greeter11Pattern di progettazione in C
Pattern SingletonPattern FactoryPattern IteratorRiepilogo: Factory di Logger3Ciclo di vita degli oggetti
Pattern del costruttorePattern del distruttoreInizializzazione sullo stackCopia profondaRiepilogo: wrapper di stringhe6Ereditarietà tramite composizione
Incorporamento delle structLa regola del primo membroAccesso ai membri della classe baseUpcastingRiepilogo: gerarchia di forme9Progetto: Disegnatore di forme
Panoramica del progettoImplementazione del cerchioImplementazione del rettangoloUtilizzo polimorficoContenitore di formeEsercitati da solo: Compilatore C online