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 :

De l'utilisation de sprintf()...


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 92
    Par défaut De l'utilisation de sprintf()...
    Comme printf(), la fonction sprintf() convertit une ou plusieurs variables suivant les formats précisés. Mais sprintf place les résultats dans la chaîne 'tampon' (son premier argument), alors que printf les envoie sur la sortie standard.

    Les résultats placés dans la chaîne pointée par tampon sont terminés par '\0'. Vous devez être sûr que la place suffisante pour coder les résultatsées est disponible.
    D'où ma question : n'y a-t-il pas un moyen plus sécurisé de faire la même chose? car par définition, la longueur de la chaîne que je vais créer n'est pas forcément déterminée... Comment éviter un éventuel dépassement de mémoire?

  2. #2
    Membre émérite
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Par défaut
    man snprintf
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    ATTENTION pour ceux qui utilisent un compilateur microsoft: la fonction snprintf() standard n'existe pas chez eux, et il n'existe aucun équivalent exact.

    Les fonctions Microsoft voisines sont:

    • * sprintf_s() (Visual 2005) : renvoit une erreur/une exception et ne copie rien du tout si le buffer est trop petit --> à jeter.
      * _snprintf() (disponible sur tous leurs compilateurs) : renvoit toujours la taille écrite dans le buffer, ne termine pas elle-même le buffer par un \0 s'il est trop court.
      * StringCchPrintf(), StringCbPrintf(), StringCchPrintfEx(), StringCbPrintfEx() (Nécessitent un SDK >=2003) : Un peu comme _snprintf(), mais terminent toujours le buffer par un \0. Les versions Ex retournent des informations sur la position et la taille du buffer restant.
    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.

  4. #4
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut Re: De l'utilisation de sprintf()...
    Citation Envoyé par @drien
    D'où ma question : n'y a-t-il pas un moyen plus sécurisé de faire la même chose? car par définition, la longueur de la chaîne que je vais créer n'est pas forcément déterminée... Comment éviter un éventuel dépassement de mémoire?
    Je te comprends. Mais en même temps, le programmeur connaît toujours la taille qu'il alloue, non?

    Nas'

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 92
    Par défaut Re: De l'utilisation de sprintf()...
    Citation Envoyé par Nasky
    Je te comprends. Mais en même temps, le programmeur connaît toujours la taille qu'il alloue, non?
    Pas forcément, si j'en ai besoin pour stocker une chaîne avec un paramètre comme un entier par exemple, si l'entier est 7 il prend 1 caractère mais si c'est 125 ils en prend trois, etc.....

    snprintf() ça à l'air bien, je connaissais pas , et une petite fonction vérifiant si ça marche ou sinon allouant plus jusqu'à ce que ça marche me parait sympatique à coder.

    Merci à tous!

    EDIT : c'est standart ça? (juste pour savoir ) parce que d'après les liens que j'ai sur la norme ANSI c'est pas standart...

  6. #6
    Membre émérite
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Par défaut Re: De l'utilisation de sprintf()...
    Citation Envoyé par @drien
    EDIT : c'est standart ça? (juste pour savoir ) parce que d'après les liens que j'ai sur la norme ANSI c'est pas standart...
    C'est conforme à la norme C99 (donc effectivement pas ansi)
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut Re: De l'utilisation de sprintf()...
    Citation Envoyé par Pouic
    Citation Envoyé par @drien
    EDIT : c'est standart ça? (juste pour savoir ) parce que d'après les liens que j'ai sur la norme ANSI c'est pas standart...
    C'est conforme à la norme C99 (donc effectivement pas ansi)
    C99 a été promulgué par l'ANSI (passer par eux est d'ailleurs une des méthodes les plus simples et moins onéreuses d'en optenir le texte).

  8. #8
    HRS
    HRS est déconnecté
    Membre chevronné
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    678
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 678
    Par défaut
    Par conséquent la taille résultante est égale à la somme des tailles
    maximum de chacun des éléments +1

    le langage C part du principe que le programmeur sait TOUJOURS ce qu'il
    fait

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Mais le programmeur, par contre, ne sait JAMAIS ce que va faire l'utilisateur, ni ce que va contenir le fichier (qui peut être modifié par une source extérieure), ni ce qu'il va recevoir lors d'une communication réseau, etc.
    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.

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: De l'utilisation de sprintf()...
    Citation Envoyé par Pouic
    Citation Envoyé par @drien
    EDIT : c'est standart ça? (juste pour savoir ) parce que d'après les liens que j'ai sur la norme ANSI c'est pas standart...
    C'est conforme à la norme C99 (donc effectivement pas ansi)
    Ben si, c'est ANSI 2000

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

Discussions similaires

  1. Probleme d'utilisation de Sprintf
    Par bouraouimed dans le forum C
    Réponses: 5
    Dernier message: 08/07/2011, 12h35
  2. comment utiliser sprintf
    Par boboss123 dans le forum C
    Réponses: 9
    Dernier message: 18/12/2009, 10h31
  3. utilisation de sprintf
    Par greg80 dans le forum C++
    Réponses: 2
    Dernier message: 01/05/2009, 14h46
  4. Utilisation de la fonction sprintf
    Par Fred677 dans le forum C
    Réponses: 3
    Dernier message: 01/03/2008, 11h21
  5. Réponses: 12
    Dernier message: 26/07/2006, 12h08

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