Menu
Coddy logo textTech

Constructeur de chaînes dynamique

Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 59 sur 61.

challenge icon

Défi

Facile

Construisons un StringBuilder : un conteneur de chaînes dynamique qui s’agrandit automatiquement lorsque vous ajoutez du texte. Il s’agit d’un utilitaire pratique qui combine la gestion dynamique de la mémoire avec les modèles de POO que vous avez maîtrisés tout au long de ce cours.

Vous organiserez votre code sur trois fichiers :

  • stringbuilder.h : déclarer la structure StringBuilder avec trois membres : un tampon char*, un size_t pour la longueur actuelle et un size_t pour la capacité totale. Déclarer les prototypes de fonctions pour créer un StringBuilder, lui ajouter du texte, récupérer la chaîne finale et libérer la mémoire. Les gardes d’inclusion sont indispensables.
  • stringbuilder.c : implémenter votre système StringBuilder :
    • create_stringbuilder : alloue un StringBuilder sur le tas, initialise le tampon avec une capacité initiale de 16 octets, définit la longueur à 0 et s’assure que le tampon commence comme une chaîne vide (terminée par un caractère nul)
    • append : prend un pointeur vers un StringBuilder et une chaîne à ajouter. Calculer la nouvelle longueur requise. Si elle dépasse la capacité, doubler la capacité (plusieurs fois si nécessaire) et utiliser realloc pour agrandir le tampon. Puis concaténer le nouveau texte à l’aide de strcat
    • get_string : renvoie un pointeur vers le tampon interne (accès en lecture seule)
    • free_stringbuilder : libère d’abord le tampon, puis la structure StringBuilder elle-même
  • main.c : lire un entier indiquant combien de chaînes ajouter. Puis lire chaque chaîne avec fgets et l’ajouter à votre StringBuilder. Après avoir ajouté toutes les chaînes, afficher la chaîne complète assemblée à l’aide de get_string. Enfin, libérer le StringBuilder.

Deux fonctions clés utilisées dans ce défi :

  • realloc(ptr, new_size) : redimensionne un bloc de mémoire précédemment alloué. Elle prend un pointeur vers le bloc existant et la nouvelle taille souhaitée en octets, puis renvoie un pointeur vers le bloc redimensionné (qui peut avoir été déplacé). Utilisez-la dans append lorsque le tampon doit être agrandi :
    sb->buffer = (char*)realloc(sb->buffer, sb->capacity);
  • fgets(buffer, size, stream) : lit une ligne de texte depuis un flux d’entrée dans un tableau de caractères, en s’arrêtant à un saut de ligne ou après la lecture de size - 1 caractères. Elle conserve le caractère de nouvelle ligne dans le tampon ; vous devrez donc le supprimer manuellement. Utilisez-la dans main.c pour lire chaque chaîne saisie :
    fgets(line, sizeof(line), stdin);
    Pour supprimer le saut de ligne final : vérifier si le dernier caractère est '\n' et le remplacer par '\0'.

Votre programme recevra :

  1. Le nombre de chaînes à ajouter
  2. Chaque chaîne sur une ligne distincte

Exemple de sortie lorsque les entrées sont 3, puis Hello, , World :

Hello World

Exemple de sortie lorsque les entrées sont 4, puis C, is, a, great language! :

C is a great language!

Exemple de sortie lorsque l’entrée est 1, puis SingleString :

SingleString

N’oubliez pas de mettre à jour le champ length après chaque opération d’ajout. Lorsque vous vérifiez si une réallocation est nécessaire, tenez compte du terminateur nul : le tampon doit disposer de suffisamment d’espace pour length + new_text_length + 1 octets. Utilisez strlen de <string.h> pour mesurer les longueurs des chaînes. Appelez également getchar() après scanf dans main.c afin de consommer le saut de ligne restant avant de lire les chaînes avec fgets.

Essayez vous-même

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

int main() {
    int n;
    scanf("%d", &n);
    getchar(); // consommer le saut de ligne après le nombre
    
    // TODO: Create a StringBuilder using create_stringbuilder()
    
    // TODO: Read n strings and append each to the StringBuilder
    // Indice : Utilisez fgets ou similaire pour lire chaque ligne
    // N'oubliez pas de gérer le caractère de nouvelle ligne de fgets si vous l'utilisez
    
    // TODO: Affichez la chaîne complète assemblée en utilisant get_string()
    
    // TODO: Free the StringBuilder using free_stringbuilder()
    
    return 0;
}

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur C en ligne