IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Logger et sprintf


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 152
    Par défaut Logger et sprintf
    Bonsoir,

    Je suis en train de faire un logger interne dans une application complexe au lieu de passer directement par un printf qui ne permettrais pas de flexibilité plus tard.

    J'ai donc décidé de faire un struct avec mes données dedans comme je le souhaite seulement pour envoyer des messages à ce log, la plupart du temps je formate mes chaînes avec printf. J'ai vu qu'on pouvait implémenter directement le code printf dans mon logger. Cependant, cela casse la compatibilité avec les autres systèmes d'exploitation (à ce que j'ai vu) car le code est différent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void loggerPush(Logger *log, char *fmt, ...) {
    	unsigned int time = clock();
    	char message[255];
     
    	// sprintf code
    	va_list args;
     
    	va_start(args, fmt);
    	vsprintf(message,fmt,args);
    	va_end(args);
    	// end
     
    /* Affiche/Sauve le message */
    }
    Est-ce que ce code ne fonctionne que sous la plat-forme Unix/Linux ou bien me suis-je tromper ? D'autre part, n'y a-t-il aucune autre solution qui puisse y remédier: un sprintf qui au lieu de modifier un char* en retourne un (char *sprintf(char *in, ...)) résoudrais mes problèmes. Aussi si d'une autre manière je pouvais passer les paramètres "..." au sprintf de la plat-forme je pourrais régler mes problèmes.

    Qu'en pensez-vous ? Merci d'avance.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Ton usage de de vsprintf() me parait tout ce qu'il y a de plus standard, mais également tout aussi fragile sur tous les systèmes: Risque de débordement de tampon.

    Il n'existe pas de fonction standard pour faire un malloc() et un sprintf() en même temps (Je crois que FreeBSD avait asprintf() pour ça).

    Ensuite, si tu veux connaître à l'avance la taille à allouer pour un sprintf():
    • En C90 pur, je crois qu'il faut passer par un fichier bidon (par exemple, un fichier temporaire créé avec tmpfile())
    • En C99, tu peux appeler [v]snprintf() avec un buffer nul.
    • Sous Visual, tu peux utiliser la fonction _[v]scprintf();
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. La commande logger
    Par Bicnic dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 29/10/2013, 10h09
  2. [Perf]Utilisation des Logger et temps de traitement ?
    Par elitost dans le forum Logging
    Réponses: 6
    Dernier message: 12/04/2005, 23h13
  3. sprintf : le point devient virgule ?!
    Par jula dans le forum C++
    Réponses: 4
    Dernier message: 17/09/2004, 12h50
  4. [log4j] Exception à la récupération de Logger
    Par Twofy dans le forum Logging
    Réponses: 5
    Dernier message: 19/07/2004, 15h49
  5. [interbase]Se logger après une première installation
    Par Ultra-FX dans le forum InterBase
    Réponses: 3
    Dernier message: 13/09/2002, 11h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo