Utilisation de sprintf pour créer un nom - C++ - Programmation
Marsh Posté le 08-02-2008 à 19:26:49
si tu travailles en C++, utilise ostringstream au lieu de ces vieux trucs moches
Marsh Posté le 08-02-2008 à 23:24:52
La fonction sprintf() est très utilisée par les programmeurs C, mais très peu par les programmeurs C++.
Elle très fiable, si on prend les précautions suivantes :
- Avoir des chaines de caractères terminées par un zéro binaire (comme pour les autres fonctions C qui utilisent des chaines de caractères, comme strcpy, ou strcmp).
- Avoir suffisament de place dans la chaine de destination.
- Avoir des paramètres qui correspondent à ceux indiqués dans le format, par exemple avoir un int, si l'on indique %d, et avoir une chaine si l'on indique %s.
Dans les paramètres qui sont après la chaine du formatage, il peut y avoir des % ou ce que l'on veut, en respectant les règles sur les caractères spécaux, mais le % n'est pas considéré comme spécial en dehors de la chaine de formatage. Il suffit de faire un petit test pour s'en rendre compte.
Marsh Posté le 09-02-2008 à 10:46:45
Il suffit de rajouter un test qui vérifie que 'numero' est inférieur à 100 millions et donc ne prendra pas plus de 8 chiffres et le truc ne devrait jamais déborder.
Enfin moi perso je mettrais plutot le buffer à [256] et après le sprintf je ferais un strlen() pour être sûr que le résultat fait pas plus de 10 caractères... Mais je me permettrais pas d'affirmer que cette methode est meilleur que de simplement rajouter le test indiqué au dessus.
Marsh Posté le 09-02-2008 à 10:50:11
non, non et non.
boost::format ou ostringstream mais pas de buffer de taille arbitraire ni de sprintf !
Arretez s'il vous plait de croire que quand on se débrouille en C on se débrouille en C++ ! LEs outils sont fondamentalement différents !
Marsh Posté le 09-02-2008 à 11:08:38
Je partais naivement du principe qu'il voulait garder son sprintf() moi.
Marsh Posté le 09-02-2008 à 11:19:32
cyberludo2013 a écrit : Je partais naivement du principe qu'il voulait garder son sprintf() moi. |
T'inquiètes c'était surtout au post d'avant que je pensais.
Marsh Posté le 10-02-2008 à 18:29:48
Tant qu'a faire du c, autant mettre un snprintf (ou un slprintf si disponible), ça évite des surprises souvent fâcheuses.
Sinon dans le c++ qui se voudrait de qualité (au moins en terme de respects des invariants) le ostringstream c'est quand même largement plus simple.
Marsh Posté le 11-02-2008 à 16:23:30
En fait, je sais que l'utilisation de sprintf n'est pas "géniale", mais je ne peux pas modifier ce code. Je dois "juste" savoir si cette partie de code peut provoquer un core. Comme l'a fait remarquer olivthill, il faut avoir une chaîne de caractères terminée par un zéro binaire, or là je ne suis pas du tout certaine que le tableau nom se finisse à tous les coups avec un \0 à la fin. Il y a juste une déclaration, non ? Vous confirmez ?
En gros, ne pas mettre une précaution du style
Code :
|
peut-il provoquer un core ?
Marsh Posté le 11-02-2008 à 16:35:08
bah si tu appelles un truc genre strlen dessus, bonjour le drame
Marsh Posté le 11-02-2008 à 17:09:24
Euh, en fait, en consultant l'aide dans le site http://www.cplusplus.com, je viens de m'apercevoir que l'ajout du caractère nul à la fin de la chaîne est automatique lors de l'exécution de sprintf...
Marsh Posté le 08-02-2008 à 16:10:00
Voici la méthode :
Note : const char CARACTERE_DEBUT = '%';
Cette méthode peut-elle planter ? Peut-il y avoir un problème de mémoire ? J'ai toujours un peu peur avec l'utilisation des fonctions du type sprintf
NB. La méthode setNom prend comme paramètre un std:string
Message édité par kason le 08-02-2008 à 16:39:02