len d'un prédire sprintf () 'ligne ed?
-
26-10-2019 - |
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)?
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.
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é.