Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1611 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Utilisation de sprintf pour créer un nom

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Utilisation de sprintf pour créer un nom

n°1684080
kason
Ab uno disce omnes
Posté le 08-02-2008 à 16:10:00  profilanswer
 

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
mood
Publicité
Posté le 08-02-2008 à 16:10:00  profilanswer
 

n°1684196
Joel F
Real men use unique_ptr
Posté le 08-02-2008 à 19:26:49  profilanswer
 

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

n°1684242
KangOl
Profil : pointeur
Posté le 08-02-2008 à 20:52:03  profilanswer
 

voire boost::format

n°1684268
Joel F
Real men use unique_ptr
Posté le 08-02-2008 à 21:38:58  profilanswer
 

aussi

n°1684304
olivthill
Posté le 08-02-2008 à 23:24:52  profilanswer
 

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.

n°1684342
cyberludo2​013
Posté le 09-02-2008 à 10:46:45  profilanswer
 

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.

n°1684343
Joel F
Real men use unique_ptr
Posté le 09-02-2008 à 10:50:11  profilanswer
 

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 !

n°1684349
cyberludo2​013
Posté le 09-02-2008 à 11:08:38  profilanswer
 

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
n°1684350
Joel F
Real men use unique_ptr
Posté le 09-02-2008 à 11:19:32  profilanswer
 

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.

n°1684612
jojoleping​ouin
Posté le 10-02-2008 à 18:29:48  profilanswer
 

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.

mood
Publicité
Posté le 10-02-2008 à 18:29:48  profilanswer
 

n°1684949
kason
Ab uno disce omnes
Posté le 11-02-2008 à 16:23:30  profilanswer
 

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
n°1684955
Joel F
Real men use unique_ptr
Posté le 11-02-2008 à 16:35:08  profilanswer
 

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

n°1684971
kason
Ab uno disce omnes
Posté le 11-02-2008 à 17:09:24  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Utilisation de sprintf pour créer un nom

 

Sujets relatifs
Latex - Utilisation de listings : encadrer du codeUtilisation d'une bibliothèque de tri via AJAX
Comment créer un lien avec des éléments d'une base de données?[VBS] AD Créer liste distrib + adresse mail
creer une feuille par ligne remplieComment créer un script de formulaire d'ecriture d'article
[SHELL]Utilisation du resultat de ma commande GREP pour un nul [CLOS]Problème d'utilisation des objets définis par l'utilisateur
Créer son Site Webcréer table paradox par programation?
Plus de sujets relatifs à : Utilisation de sprintf pour créer un nom


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR