Question

Y at-il une fonction quelque part que je peux utiliser pour prédire l'espace sprintf () aura besoin? OIEau, je peux appeler une fonction size_t predict_space ( "% s \ n", some_string) qui renverra la longueur de la chaîne C qui résultera de sprintf ( "% s \ n", some_string)?

Était-ce utile?

La solution

C99 snprintf (note: Windows et SUSv2, ne fournissent pas une mise en œuvre de snprintf (ou _snprintf) conforme à la norme) :

       7.19.6.5  The snprintf function

       Synopsis

       [#1]

               #include <stdio.h>
               int snprintf(char * restrict s, size_t n,
                       const char * restrict format, ...);

       Description

       [#2]  The snprintf function is equivalent to fprintf, except
       that the output is  written  into  an  array  (specified  by
       argument  s) rather than to a stream.  If n is zero, nothing
       is written, and s may be a null pointer.  Otherwise,  output
       characters  beyond the n-1st are discarded rather than being
       written to the array, and a null character is written at the
       end  of  the characters actually written into the array.  If
       copying  takes  place  between  objects  that  overlap,  the
       behavior is undefined.

       Returns

       [#3]  The snprintf function returns the number of characters
       that would have been written had n been sufficiently  large,
       not  counting  the terminating null character, or a negative
       value if  an  encoding  error  occurred.   Thus,  the  null-
       terminated output has been completely written if and only if
       the returned value is nonnegative and less than n.

Par exemple:

len = snprintf(NULL, 0, "%s\n", some_string);
if (len > 0) {
    newstring = malloc(len + 1);
    if (newstring) {
        snprintf(newstring, len + 1, "%s\n", some_string);
    }
}

Autres conseils

L'utilisation peut utiliser snprintf () avec une taille de 0 à savoir exactement combien d'octets seront nécessaires. Le prix est que la chaîne est en effet formaté deux fois.

Vous pouvez utiliser snprintf pour cela, comme dans

sz = snprintf (NULL, 0, fmt, arg0, arg1, ...);

Mais voir les notes de Autoconf sur snprintf.

Dans la plupart des cas, vous pouvez calculer en ajoutant la longueur de la chaîne que vous concaténez et prendre une longueur maximale pour les valeurs numériques en fonction du format utilisé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top