Constructeur de chaînes dynamique
Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 59 sur 61.
Défi
FacileConstruisons 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 structureStringBuilderavec trois membres : un tamponchar*, unsize_tpour la longueur actuelle, et unsize_tpour 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 utilisezreallocpour agrandir le tampon. Ensuite, concaténez le nouveau texte en utilisantstrcatget_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 defgetset ajoutez-la à votre StringBuilder. Une fois toutes les chaînes ajoutées, affichez la chaîne complète assemblée à l'aide deget_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 dansappendlorsque 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 lorsquesize - 1caractères ont été lus. Elle conserve le caractère de saut de ligne dans le tampon, vous devrez donc le supprimer manuellement. Utilisez-la dansmain.cpour 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 :
- Le nombre de chaînes à ajouter
- Chaque chaîne sur une ligne séparée
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 les entrées sont 1, puis SingleString :
SingleStringN'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
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 cercle