Menu
Coddy logo textTech

Constructeur de chaînes dynamique

Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 59 sur 61.

challenge icon

Défi

Facile

Construisons un StringBuilder — un conteneur de chaîne dynamique qui s'agrandit automatiquement au fur et à mesure que 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éclarez 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éclarez les prototypes de fonctions pour créer un StringBuilder, y ajouter du texte, récupérer la chaîne finale et libérer la mémoire. Les gardes d'inclusion sont essentiels.
  • stringbuilder.c : Implémentez 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 StringBuilder et une chaîne à ajouter. Calculez la nouvelle longueur requise. Si elle dépasse la capacité, doublez la capacité (plusieurs fois si nécessaire) et utilisez realloc pour agrandir le tampon. Ensuite, concaténez le nouveau texte en utilisant 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 : Lisez un entier indiquant combien de chaînes ajouter. Lisez ensuite chaque chaîne à l'aide de fgets et ajoutez-la à votre StringBuilder. Une fois toutes les chaînes ajoutées, affichez la chaîne complète assemblée à l'aide de get_string. Enfin, libérez 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, et renvoie un pointeur vers le bloc redimensionné (éventuellement déplacé). Utilisez-la dans append lorsque le tampon doit s'agrandir :
    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, s'arrêtant à un saut de ligne ou lorsque size - 1 caractères ont été lus. Elle conserve le caractère de saut de ligne dans le tampon, vous devrez donc le supprimer manuellement. Utilisez-la dans main.c pour lire chaque chaîne d'entrée :
    fgets(line, sizeof(line), stdin);
    Pour supprimer le saut de ligne final : vérifiez si le dernier caractère est '\n' et remplacez-le par '\0'.

Votre programme recevra :

  1. Le nombre de chaînes à ajouter
  2. Chaque chaîne sur une ligne séparée

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 les entrées sont 1, puis SingleString :

SingleString

N'oubliez pas de mettre à jour le champ length après chaque opération d'ajout. Lors de la vérification si une réallocation est nécessaire, tenez compte du terminateur nul — le tampon a besoin d'espace pour length + new_text_length + 1 octets. Utilisez strlen de <string.h> pour mesurer les longueurs de chaîne. Appelez également getchar() après scanf dans main.c pour 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: Créer un StringBuilder en utilisant create_stringbuilder()
    
    // TODO: Lire n chaînes et ajouter chacune au StringBuilder
    // Hint: Utiliser fgets ou similaire pour lire chaque ligne
    // N'oubliez pas de gérer le caractère de saut de ligne de fgets si vous l'utilisez
    
    // TODO: Afficher la chaîne complète assemblée en utilisant get_string()
    
    // TODO: Libérer le StringBuilder en utilisant free_stringbuilder()
    
    return 0;
}

Toutes les leçons de Object Oriented Programming