#include <stdio.h> // <cstdio> en C++
int snprintf( char * restrict buffer, size_t bufferSize, const char * restrict format, ... ); // À partir de C99
La fonction snprintf permet de produire une chaîne de caractères formatée dans un buffer
pré-alloué, comme le fait la fonction sprintf. La différence importante est
que snprintf reçoit aussi la taille maximale du buffer à utiliser. Cette information permet
d'éviter d'écrire au-delà de la zone mémoire disponible.
'\0'.
Si le buffer est trop petit et que bufferSize est supérieur à 0, la chaîne
produite sera tronquée mais elle restera correctement terminée.
Le langage de formatage utilisé par snprintf est le même que celui utilisé par
printf, fprintf et
sprintf. Vous pouvez donc utiliser les formats classiques :
%d, %s, %f, %p, etc.
En cas de succès, la fonction retourne le nombre de caractères qui auraient été produits si le buffer avait été suffisamment grand. Le caractère nul terminal n'est pas comptabilisé dans cette valeur. En cas d'erreur d'encodage, une valeur négative est retournée.
Pour savoir si la chaîne a été tronquée, il suffit donc de comparer la valeur de retour avec la taille du buffer. Si la valeur retournée est supérieure ou égale à la taille du buffer, la chaîne produite ne contient qu'une partie du résultat attendu.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <stdio.h> int main() { char buffer[12]; int needed = snprintf( buffer, sizeof buffer, "%s %s", "Diego", "De La Vega" ); if ( needed < 0 ) { fprintf( stderr, "Erreur durant le formatage.\n" ); return 1; } printf( "Buffer produit : [%s]\n", buffer ); printf( "Taille necessaire : %d caracteres\n", needed ); printf( "Taille disponible : %zu caracteres\n", sizeof buffer ); if ( (size_t) needed >= sizeof buffer ) { printf( "La chaine a ete tronquee.\n" ); } return 0; } |
Voici l'affichage produit par cet exemple :
$> gcc -o Sample -Wall Sample.c $> ./Sample Buffer produit : [Diego De La] Taille necessaire : 16 caracteres Taille disponible : 12 caracteres La chaine a ete tronquee. $>
Comme la valeur de retour indique la taille nécessaire, il est possible de faire un premier appel avec un buffer nul et une taille nulle, puis d'allouer exactement la quantité de mémoire requise. N'oubliez pas d'ajouter un octet pour stocker le caractère nul terminal.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <stdio.h> #include <stdlib.h> int main() { int line = 15; const char * status = "OK"; int needed = snprintf( NULL, 0, "Ligne %d : %s", line, status ); if ( needed < 0 ) { return 1; } char * buffer = malloc( (size_t) needed + 1 ); if ( buffer == NULL ) { return 1; } snprintf( buffer, (size_t) needed + 1, "Ligne %d : %s", line, status ); printf( "%s\n", buffer ); free( buffer ); return 0; } |
Voici l'affichage produit par cet exemple :
$> gcc -o Sample -Wall Sample.c $> ./Sample Ligne 15 : OK $>
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :