Utiliser sprintf sans un tampon alloué manuellement

Dans l’application sur laquelle je travaille, la fonction de journalisation utilise sprintf pour formater le texte écrit dans un fichier. Donc, quelque chose comme:

 char buffer[512]; sprintf(buffer, ... ); 

Cela pose parfois des problèmes lorsque le message envoyé devient trop volumineux pour la mémoire tampon allouée manuellement.

Existe-t-il un moyen d’obtenir un comportement sprintf sans avoir à allouer manuellement de la mémoire de cette façon?

EDIT: bien que sprintf soit une opération C, je recherche des solutions de type C ++ (s’il en existe!) Pour obtenir ce genre de comportement …

Non, vous ne pouvez pas utiliser sprintf() pour allouer suffisamment de mémoire. Les alternatives incluent:

  • utilisez snprintf() pour tronquer le message – ne résout pas complètement votre problème, mais empêche le problème du dépassement de mémoire tampon
  • doubler (ou sortingpler ou …) la mémoire tampon – sauf si vous êtes dans un environnement contraint
  • utilisez C ++ std::ssortingng et ossortingngstream – mais vous perdrez le format printf, vous devrez utiliser l’opérateur <<
  • utilisez le format Boost fourni avec un opérateur% semblable à printf

Vous pouvez utiliser asprintf (3) (remarque: non standard) qui alloue le tampon pour vous, de sorte que vous n’avez pas besoin de le pré-allouer.

Je ne connais pas non plus de version qui évite l’allocation, mais si C99 sprintfs autorise comme chaîne le pointeur NULL. Pas très efficace, mais cela vous donnerait la chaîne complète (tant que la mémoire est suffisante) sans risquer de déborder:

 length = snprintf(NULL, ...); str = malloc(length+1); snprintf(str, ...); 

“la fonction de journalisation utilise sprintf pour formater le texte écrit dans un fichier”

fprintf() n’impose aucune limite de taille. Si vous pouvez écrire le texte directement dans un fichier, faites-le!

Je suppose cependant qu’il existe une étape de traitement intermédiaire. Si vous savez combien d’espace est nécessaire, vous pouvez utiliser malloc() pour allouer autant d’espace.

Une technique souvent utilisée consiste à allouer un tampon de taille raisonnable (qui sera suffisamment volumineux 99% du temps) et, dans le cas contraire, à fractionner les données en fragments que vous traiterez un par un.

Avec la version vanilla de sprintf, il n’ya aucun moyen d’empêcher les données d’écraser le tampon transmis. Cela est vrai que la mémoire soit allouée manuellement ou allouée sur la stack.

Pour éviter que la mémoire tampon ne soit écrasée, vous devez utiliser l’une des versions les plus sécurisées de sprintf, telle que sprintf_s (windows uniquement).

http://msdn.microsoft.com/en-us/library/ybk95axf.aspx