Constructeur de chaînes dynamique
Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 59 sur 61.
Défi
FacileConstruisons 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 structureStringBuilderavec trois membres : un tamponchar*, unsize_tpour la longueur actuelle et unsize_tpour 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 utiliserreallocpour agrandir le tampon. Puis concaténer le nouveau texte à l’aide destrcatget_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 avecfgetset l’ajouter à votre StringBuilder. Après avoir ajouté toutes les chaînes, afficher la chaîne complète assemblée à l’aide deget_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 dansappendlorsque 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 desize - 1caractères. Elle conserve le caractère de nouvelle ligne dans le tampon ; vous devrez donc le supprimer manuellement. Utilisez-la dansmain.cpour 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 :
- Le nombre de chaînes à ajouter
- Chaque chaîne sur une ligne distincte
Exemple de sortie lorsque les entrées sont 3, puis Hello, , World :
Hello WorldExemple 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 :
SingleStringN’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
1Bases de la programmation modulaire
Fichiers d'en-têteGardes d'inclusionFichiers sourcesFonctions statiquesRécapitulatif : Calculatrice modulaire4Encapsulation
Concept des pointeurs opaquesDéfinir des structures opaquesGetters et settersValidation dans les settersRécapitulatif : La boîte secrète2Objets et méthodes
Structs comme objetsLe pointeur 'Self'Rigueur du mot-clé constPointeur vs ValeurMéthodes utilitairesRécapitulatif : Point Manager5Projet : Compte bancaire simple
Configuration du projetImplémentation du compte8Polymorphisme
Pointeurs de fonctions dans les structuresSimulation de méthodesLe concept d'interfaceImplémentation d'interfacesItération polymorphiqueRécapitulatif : Greeter11Patrons de conception en C
Patron SingletonPatron FabriquePatron ItérateurRécapitulatif : Logger Factory3Cycle de vie des objets
Pattern de constructeurPattern de destructeurInitialisation sur la pileCopie profondeRécapitulatif : String Wrapper6Héritage par composition
Imbrication de structLa règle du premier membreAccès aux membres parentsUpcastingRécapitulatif : Hiérarchie des formes9Projet : Dessinateur de formes
Aperçu du projetImplémentation du cercleImplémentation du rectangleUtilisation polymorpheConteneur de formesEntraînez-vous par vous-même : Compilateur C en ligne