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 :

Connaitre la taille du résultat de sprintf


Sujet :

C

  1. #1
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut Connaitre la taille du résultat de sprintf
    Bonjour,
    je cherche à connaitre la taille de la chaine retourné par sprintf. Le but est de pouvoir alloué un espace mémoire pour ensuite y mettre la chaîne formaté. J'ai essayer en passant NULL comme premier paramètre pour seulement récupérer le retour de la fonction mais mon OS n'a pas apprécié.

    Le but est de recréer la fonction g_strdup_printf de la glib, je vien de regarder les sources, cette fonction se contante d'appeler g_vasprintf qui fait le formatage et crée la chaîne.

    Merci de votre aide

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Connaitre la taille du résultat de sprintf
    Citation Envoyé par gege2061
    je cherche à connaitre la taille de la chaine retourné par sprintf. Le but est de pouvoir alloué un espace mémoire pour ensuite y mettre la chaîne formaté. J'ai essayer en passant NULL comme premier paramètre pour seulement récupérer le retour de la fonction mais mon OS n'a pas apprécié.
    Effectivement, ce serait l'idéal. (C'est peut être même une extension avec certaines implémentations de la RTL).
    Le but est de recréer la fonction g_strdup_printf de la glib, je vien de regarder les sources, cette fonction se contante d'appeler g_vasprintf qui fait le formatage et crée la chaîne.
    Le truc connu plus ou moins portable est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #if defined (MSDOS) || defined (msdos) || defined (_windows)
    #define F_NUL "nul"
    #elif defined (linux)
    #define F_NUL "/dev/nul"
    #else
    #error not supported
    #endif
    <...>
    {
       FILE *fp_nul = fopen(F_NUL, "w");
    <...>
    (a faire une fois au debut du programme avec fp_nul accessible...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int n = fprintf (fb_nul, "...", ...);
    n contient le nombre de caractères émis.
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Ok, c'est pas top comme solution mais pour un usage personnel ça ira

    pour ton aide

    P.S : c'est quoi RTL ? (j'ai retrouvé ce terme dans la doc de la Glib mais sur google à part la radio c'est rien trouvé)

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par gege2061
    c'est quoi RTL ?
    RunTime Library (la bibliothèque standard du C.)
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    J'ai (enfin) trouvé la solution : str_dup_printf

    Vivement que le C99 soit mis en place !

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    sinon, le snprintf() du standard C99 te donne la taille complète.
    Mais il n'est pas implémenté chez Microsoft.

    Par contre, ils ont _scprintf() pour donner la taille (l'équivalent du fprintf dans le vide, ss doute)
    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.

  7. #7
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Médinoc
    sinon, le snprintf() du standard C99 te donne la taille complète.
    Bah oui c'est ce que j'ai utilisé (vsnprintf plus précisement) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #include <stdarg.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    char *str_dup_printf (const char *format, ...)
    {
      char *s = NULL;
     
      if (format)
      {
        char t[1] = "";
        size_t size = 0;
        va_list pa;
     
        va_start (pa, format);
        size = vsnprintf (t, 1, format, pa);
        size++; /* Pour le caractère de fin de chaine */
        s = malloc (sizeof (*s) * size);
        if (s)
        {
          vsnprintf (s, size, format, pa);
        }
      }
      return s;
    }
    Citation Envoyé par Médinoc
    Mais il n'est pas implémenté chez Microsoft
    Chaque compilateur a ces lacunes au niveau du C99, c'est pour cela que je n'aime pas utiliser les nouveautés mais dans ce cas je n'ai pas le choix!

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

Discussions similaires

  1. [C#] Comment connaitre la taille d'un fichier.
    Par PascalCmoa dans le forum Windows Forms
    Réponses: 6
    Dernier message: 09/02/2018, 08h54
  2. Réponses: 7
    Dernier message: 08/06/2005, 11h04
  3. Connaitre la taille de la RAM
    Par dway dans le forum Assembleur
    Réponses: 23
    Dernier message: 15/09/2004, 10h05
  4. [JSP] Connaitre la taille d'un fichier
    Par dst dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 21/06/2004, 17h22
  5. [JVM] Connaitre la taille mémoire utilisé par les dif classe
    Par sur_uix dans le forum Général Java
    Réponses: 4
    Dernier message: 18/09/2003, 09h17

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