Utilisation de sprintf pour créer un nom

Utilisation de sprintf pour créer un nom - C++ - Programmation

Marsh Posté le 08-02-2008 à 16:10:00    

Voici la méthode :
 

Code :
  1. void ServeurPoints::_nommer(PointGeo* aPtrPoint)
  2. {
  3.   static unsigned int numero = 1;
  4.   char nom[10];
  5.   sprintf (nom, "%c%i", CARACTERE_DEBUT, numero);
  6.   aPtrPoint->setNom (nom);
  7.   numero ++;
  8. }


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  :sarcastic:
NB. La méthode setNom prend comme paramètre un std:string


Message édité par kason le 08-02-2008 à 16:39:02
Reply

Marsh Posté le 08-02-2008 à 16:10:00   

Reply

Marsh Posté le 08-02-2008 à 19:26:49    

si tu travailles en C++, utilise ostringstream au lieu de ces vieux trucs moches ;)

Reply

Marsh Posté le 08-02-2008 à 20:52:03    

voire boost::format

Reply

Marsh Posté le 08-02-2008 à 21:38:58    

aussi

Reply

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.

Reply

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.

Reply

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 !

Reply

Marsh Posté le 09-02-2008 à 11:08:38    

Je partais naivement du principe qu'il voulait garder son sprintf() moi.

Message cité 1 fois
Message édité par cyberludo2013 le 11-02-2008 à 16:37:32
Reply

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.

Reply

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.

Reply

Marsh Posté le 10-02-2008 à 18:29:48   

Reply

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 :
  1. nom[9] = '\0';


peut-il provoquer un core ?


Message édité par kason le 11-02-2008 à 16:29:51
Reply

Marsh Posté le 11-02-2008 à 16:35:08    

bah si tu appelles un truc genre strlen dessus, bonjour le drame :/

Reply

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...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed