2010-12-08 38 views
0

Je me demande si c'est la bonne façon de concatenate et NUL terminer les chaînes, y compris la largeur.concaténation des chaînes et snprintf en c

#define FOO "foo" 
const char *bar = "bar"; 
int n = 10; 
float f = 10.2; 

char *s; 
int l; 

l = snprintf (NULL, 0, "%-6s %-10s %4d %4f",FOO, bar, n, f); 
s = malloc (l + 4); // should it be the number of formats tags? 
if (s == null) return 1; 
sprintf (s, "%-6s %-10s %4d %4f", FOO, bar, n, f); 
+0

Il peut être judicieux, à des fins de maintenance, de définir une chaîne de format utilisée par 'snprintf' et' sprintf'. Ça serait vraiment nul si ça changeait à un endroit et pas à l'autre! –

+0

Cela semble une bonne idée, serait-il possible de poster un exemple de code en référence à cela? Merci – Lucas

+1

Juste déclarer quelque chose comme 'const char * fmt_str ="% -6s% -10s% 4d% 4f ";' et l'utiliser comme chaîne de format dans les deux endroits. –

Répondre

0

Vous avez seulement besoin d'ajouter 1 à la valeur retournée par snprintf(), car il n'y a qu'une seule terminaison null ajouté.

Toutefois, vous devez vérifier l == -1 (indiquant que snprintf() a échoué).

+0

'snprintf' n'est pas défini dans le C89 d'origine, et je pense qu'il y avait quelques plates-formes avec des implémentations non-C99-conformes, mais C99 dit que' snprintf (NULL, ...) 'est censé fonctionner le manière OP l'utilise ici. – ephemient

+0

@ ephemient: Tout à fait, j'ai supprimé ce bit. – caf

+0

J'ai compris, merci! – Lucas

1

Plusieurs systèmes ont une fonction asprintf dans leurs bibliothèques C standard qui fait exactement ce que vous faites ici: allocate et sprintf.