C++ : Création d'une bibliothèque de chaînes de caractères

Appliquer les méthodes de développement

Testez gratuitement nos 1330 formations

pendant 10 jours !

Tester maintenant Afficher tous les abonnements
Une bibliothèque chaîne se distingue par la présence de fonctionnalités qui la rendent incontournable. Il s'agit notamment du formatage et de la normalisation.

Transcription

Nous allons maintenant ajouter à notre classe des fonctions utilitaires, des méthodes qui vont nous permettre de formater une chaîne à la façon d'un printf, ici avec des %, dans notre test, une fonction d'élagage qu'on appelle trim en anglais, ici pour enlever les caractères inutiles en début et en fin. Ces caractères inutiles sont les caractères de tabulation, d'espace, de retour à la ligne. Puis, on va voir deux fonctions de mise en minuscule et en majuscule. Puis dans notre test, on teste toujours si notre mémoire retombe bien à zéro à la fin du test. Commençons tout de suite l'implémentation de ces méthodes par le formatage. Pour faire le formatage, il nous faut un nombre variable de paramètres, d'où les trois petits points. Pour manipuler ce genre de paramètres, c'est avec la bibliothèque standard stdarg de C. Donc, on va le faire tout de suite. Inclure stdarg, « cstdarg », et puis comme on va devoir formater à la façon d'un printf, on va inclure la bibliothèque qui possède non seulement un printf, mais ici on utilisera snprintf qui permet de formater en mémoire ce que l'on veut faire. Pour formater, on va écrire ceci. Les deux premières lignes permettent de récupérer les arguments à la suite qui suivent format, args permettant de les parcourir. Ces deux lignes-là permettent d'appeler vsnprintf une première fois pour connaître le nombre de caractères qui résulteront du formatage. En effet, on ne peut pas savoir à l'avance le nombre de caractères du formatage, donc on est obligé d'appeler une première fois vsnprintf avec un seul caractère. Il va échouer, mais va nous retourner le nombre de caractères requis. On peut ainsi après utiliser ce nombre de caractères requis pour allouer ce nombre de caractères requis, se repositionner avec le va_end et le va_start après format, de façon à repasser après format pour refaire un formatage avec vsnprintf, mais cette fois-ci avec la taille finale. On va réinitialiser notre champ de taille. On va aussi réinitialiser l'adresse de la chaîne que contient notre chaîne à nous, puisqu'il va falloir maintenant pointer sur cette nouvelle zone mémoire. L'ancienne sera libérée, puisqu'on a un pointeur intelligent. Donc, grâce à reset, et surtout grâce au fait qu'on utilise un pointeur intelligent, on aura une libération de l'ancienne zone mémoire et une affectation maintenant de celle-là. Notre méthode serait terminée s'il n'y avait pas le problème d'incompatibilité de certains compilateurs qui ont une implémentation de vsnprintf particulière et qui retourne -1 s'ils ne peuvent pas formater. Dans ce cas-là, on va prendre une taille... ...inférieure à zéro. On va prendre une taille qui va être un peu plus grande. C'est un problème que vous pouvez rencontrer par exemple avec des versions antérieures ou égales à 2013. Donc, « Si vsnprintf non standard ». On a donc un autre formater maintenant qui gère un peu tous les cas et surtout qui fait un formatage correct. On va s'intéresser maintenant à elaguer. elaguer doit élaguer tous les caractères spécifiés en paramètre par caracteres. Pour ça, on va faire un premier parcours pour chercher les premiers caractères pertinents. Donc, on va partir du début. Ici, val.get nous fait partir du début et pertinents est un pointeur qui désigne le premier caractère pertinent. Au début, on ne les trouve pas, il faut continuer tant qu'on n'est pas arrivé à la fin de la chaîne et qu'on a des caractères. Ici *pertinents, c'est le caractère sur lequel on est, qui, s'il fait partie de caracteres, n'est pas pertinent et donc il faut avancer. Donc, notre boucle avance tant qu'on n'est pas arrivé à la fin et qu'on a des caractères non pertinents. Alors ici, on a un point-virgule pour dire que ce for est vide, puisque tout est fait dans les conditions du for. Il faut ensuite, une fois qu'on a fini la boucle, savoir si on a fini parce qu'on était arrivé à la fin de la chaîne ou si on était arrivé parce qu'on avait trouvé un caractère pertinent. Le caractère pertinent, c'est dans cette condition-là, dans le else c'est quand on ne trouve rien de pertinent. Ici, j'en profite pour faire un return *this. Alors, si un caractère pertinent est trouvé, on va partir de la fin et faire exactement une recherche dans l'autre sens, de partir de la fin ici, et faire la même recherche avec strchr en reculant fin - - . Et dans le fin, on va désigner le dernier caractère pertinent. On met alors à jour la taille de notre chaîne ici en se basant sur fin et sur pertinents et on décale par une boucle tous les caractères de notre chaîne, puisqu'il faut écraser les premiers caractères qui ne sont pas pertinents. Donc on repart du début, ici deb, puis on va jusqu'à la fin, fin ici, et on avance, on fait progresser pertinents et deb, et on écrase avec les caractères pertinents les débuts de chaîne. Une fois cette opération terminée, on peut écraser, tronquer la chaîne. Dans le cas où on ne trouve rien de pertinent, la taille est à zéro et les premiers caractères pertinents, ils sont au tout début, c'est-à-dire qu'on va tronquer la chaîne et la restreindre à une chaîne vide. Là, ça va être le début, val.get. Donc là, pertinents pointe sur le début et on force à zéro ce premier caractère. Donc, dans les deux cas, on tronque la chaîne. Voilà pour la méthode elaguer. Enfin, deux méthodes à écrire : la mise en majuscule et la mise en minuscule. Donc là, on parcourt la chaîne avec un pointeur. Tant qu'il est non vide, on passe en majuscule avec toupper qui est une fonction qui permet de passer un caractère en majuscule. Ça ne prend pas en compte les caractères accentués français. On pourrait affiner cette méthode pour le faire. On peut maintenant lancer le test. On a tous les tests qui passent et pas de fuite mémoire, le test est OK aussi. Donc, nous voilà avec des fonctions utilitaires très pratiques. Il nous faut maintenant des opérateurs pour utiliser facilement notre chaîne de caractères. C'est ce que nous allons voir.

C++ : Création d'une bibliothèque de chaînes de caractères

Acquérez les méthodes de développement en C++ avec la création de bibliothèques de chaînes de caractères personnalisées. Abordez les constructeurs, les structures de données, etc.

45 min (10 vidéos)
Aucun commentaire n´est disponible actuellement
 
Logiciel :
Spécial abonnés
Date de parution :24 oct. 2016

Votre formation est disponible en ligne avec option de téléchargement. Bonne nouvelle : vous ne devez pas choisir entre les deux. Dès que vous achetez une formation, vous disposez des deux options de consultation !

Le téléchargement vous permet de consulter la formation hors ligne et offre une interface plus conviviale. Si vous travaillez sur différents ordinateurs ou que vous ne voulez pas regarder la formation en une seule fois, connectez-vous sur cette page pour consulter en ligne les vidéos de la formation. Nous vous souhaitons un excellent apprentissage avec cette formation vidéo.

N'hésitez pas à nous contacter si vous avez des questions !