Journal Asprintf

Posté par  (site web personnel) .
Étiquettes : aucune
0
1
déc.
2004
Cher journal je vais te faire part d'une decouvèrte que j'ai faite et qui apparement n'est pas tres connu mais justement meriterait de l'être:
asprintf
Cette fonction est l'équivalent de sprintf, mais elle alloue à la taille voulue le buffer passé par un pointeur en premier argument.
Seul probleme c'est que pour la glibc donc adieu portabilité.
Dans le meme genre le %a de sscanf alloue automatiquement la mémoire nécessaire
Bon voila si ca pouvait en aider quelques uns
  • # oui mais ....

    Posté par  . Évalué à -1.

    Elle est spécifique a la libc (et c'est bien dommage je trouve)
  • # asprintf portable

    Posté par  . Évalué à 1.

    Dans la glib t'as un g_strdup_printf qui fait la même chose et qui lui est portable même si ça nécessite l'utilisation d'une lib supplémentaire. Enfin vu que faire du C sans la glib ça tient du masochisme...
    • [^] # Re: asprintf portable

      Posté par  (site web personnel) . Évalué à 1.

      Pour tout te dire le asprintf c'est dans la glib que je l'ai trouve (tien accents qui marchent po), mais j'ai pas trouve la partie portable extra glibc :/
      J'y retournerais
      Enfin vu que faire du C sans la glib ça tient du masochisme...
      Moi on me l'interdit strictement j'ai toujours pas compris pourquoi
      j'croi que c'etait soit disant que ca rajoutant une liste de deps pas possible (bien sur c'est meme pour ca que arts utilise la glib pour dependre de gtk ET de qt)
      • [^] # Re: asprintf portable

        Posté par  . Évalué à 2.

        > j'croi que c'etait soit disant que ca rajoutant une liste de deps pas possible

        La prochaine personne qui te dit ça tu lui mets qques baffes de ma part pour lui apprendre à dire n'importe quoi ? ;)

        $ apt-cache depends libglib2.0-0
        libglib2.0-0
        Dépend: libc6
        Recommande: libglib2.0-data

        $ apt-cache depends libglib2.0-data
        libglib2.0-data
        Dépend: libglib2.0-0
        Est en conflit avec: <libglib1.3-data>
        Remplace: <libglib1.3>
        Remplace: <libglib1.3-data>

        >Pour tout te dire le asprintf c'est dans la glib que je l'ai trouve (tien accents qui
        >marchent po), mais j'ai pas trouve la partie portable extra glibc :/

        cf g_vasprintf dans gprintf mais qui utilise à son tour d'autres fonctions...
      • [^] # Re: asprintf portable

        Posté par  . Évalué à 2.

        tu ne confondrais pas glib et glibc par hasard ?
    • [^] # Re: asprintf portable

      Posté par  . Évalué à 3.

      Enfin vu que faire du C sans la glib ça tient du masochisme...

      tu n'exagèrerais pas un petit peu la quand même ? Qu'est ce qu'il y a de si indispensable dans la glib ?
      • [^] # Re: asprintf portable

        Posté par  . Évalué à 4.

        * Des fonctions de manipulation de chaînes qui se comportent sainement (ie qui vont pas faire de buffer overflow parce que t'as pas fait gaffe que dans tel cas particulier la chaîne que t'obtiens en résultat es pas terminée par un \0)

        * Des types de données fort utiles (listes, tables de hachages, ...)

        * Gestion de l'utf8 (un peu plus anecdotique peut être)
  • # asprintf est beau

    Posté par  (site web personnel) . Évalué à 2.

    asprintf est beau mais y'a mieux, y'a asprintf_ : meilleure API (ah là là quand donc les gens arrêteront de coder tout en impératif borné..) et portable :

    -----------8<--------------------8<--------------------8<--------------------8<---------
    char * vasprintf_(const char *msg, va_list args)
    {
        char s[8192];
        vsnprintf(s, sizeof(s), msg, args);
        return strdup(s);
    }

    // _GNU_SOURCE's asprintf like, but
    // - doesn't need _GNU_SOURCE
    // - returns allocated string
    char * asprintf_(const char *msg, ...)
    {
        char * results;
        va_list arg_ptr;
        va_start(arg_ptr, msg);
        results = vasprintf_(msg, arg_ptr);
        va_end(arg_ptr);
        return results;
    }
    -----------8<--------------------8<--------------------8<--------------------8<---------

    (un peu de travail supplémentaire si on veut supporter les chaînes très longues)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.