Participer au site avec un Tip
Rechercher
 

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 :

Vous êtes un professionnel et vous avez besoin d'une formation ? Programmation avec
Le langage C
Voir le programme détaillé

Fonction snprintf (C99)

Entête à inclure

#include <stdio.h>  // <cstdio> en C++

Fonction snprintf (C99)

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.

La taille passée en second paramètre inclut le caractère nul terminal '\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.

Paramètres

Valeur de retour

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.

Exemple de code

 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;
}
Exemple d'utilisation de la fonction snprintf

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.
$>

Produire un buffer à la bonne taille

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;
}
Allocation d'un buffer adapté

Voici l'affichage produit par cet exemple :

$> gcc -o Sample -Wall Sample.c
$> ./Sample
Ligne 15 : OK
$>

Sujets connexes

fprintf
free
malloc
printf
sprintf
strlen
vsnprintf
vsnprintf_s


Vous êtes un professionnel et vous avez besoin d'une formation ? Programmation avec
Le langage C
Voir le programme détaillé