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é

Fonctions vfprintf, vprintf, vsprintf et vsnprintf

Entêtes à inclure

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

Fonctions vfprintf, vprintf, vsprintf et vsnprintf

int vfprintf( FILE * stream, const char * format, va_list arguments );                       // Avant C99
int vfprintf( FILE * restrict stream, const char * restrict format, va_list arguments );     // A partir de C99
int vprintf( const char * format, va_list arguments );                                       // Avant C99
int vprintf( const char * restrict format, va_list arguments );                              // A partir de C99
int vsprintf( char * buffer, const char * format, va_list arguments );                       // Avant C99
int vsprintf( char * restrict buffer, const char * restrict format, va_list arguments );     // A partir de C99
int vsnprintf( char * restrict buffer, size_t bufferSize, const char * restrict format, va_list arguments );   // A partir de C99

Ces fonctions sont les versions basées sur va_list des fonctions fprintf, printf, sprintf et snprintf. Elles sont principalement utilisées quand vous écrivez vous-même une fonction à nombre variable de paramètres et que vous souhaitez transmettre ces paramètres à une fonction de formatage.

Le principe est simple : votre fonction récupère ses paramètres variables dans une variable de type va_list, puis cette variable est passée à l'une des fonctions de cette page.

Ajout du mot clé restrict en C99

Depuis C99, plusieurs prototypes de <stdio.h> utilisent le mot clé restrict. Ce mot clé indique au compilateur que les zones mémoire pointées par les paramètres concernés ne doivent pas se recouvrir. Cela ne change pas l'intention des fonctions, mais cela précise les contraintes d'utilisation et peut permettre certaines optimisations.

Si vous compilez en C89/C90, vous retrouverez les prototypes sans restrict. Si vous compilez en C99 ou dans une version plus récente du standard C ISO, les prototypes peuvent utiliser restrict.

Paramètres

Valeur de retour

Les fonctions vfprintf, vprintf et vsprintf retournent le nombre de caractères produits, ou une valeur négative en cas d'erreur.

La fonction vsnprintf 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. Si la valeur retournée est supérieure ou égale à la taille du buffer, la chaîne a été tronquée.

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 
 24 
 25 
 26 
 27 
 28 
 29 
 30 
 31 
 32 
 33 
#include <stdarg.h>
#include <stdio.h>

void logMessage( FILE * stream, const char * format, ... ) {
    va_list arguments;

    va_start( arguments, format );
    vfprintf( stream, format, arguments );
    va_end( arguments );
}

int buildMessage( char * buffer, size_t bufferSize, const char * format, ... ) {
    va_list arguments;

    va_start( arguments, format );
    int result = vsnprintf( buffer, bufferSize, format, arguments );
    va_end( arguments );

    return result;
}

int main() {
    char buffer[32];

    logMessage( stdout, "[%s] fichier %s ligne %d\n", "INFO", "main.c", 42 );

    int needed = buildMessage( buffer, sizeof buffer, "%s %s", "Reference", "Koor.fr" );

    printf( "Buffer : %s\n", buffer );
    printf( "Taille : %d caracteres\n", needed );

    return EXIT_SUCCESS;
}
Exemple d'utilisation de vfprintf et vsnprintf

Voici l'affichage produit par cet exemple :

$> gcc -o Sample -Wall Sample.c
$> ./Sample
[INFO] fichier main.c ligne 42
Buffer : Reference Koor.fr
Taille : 17 caracteres
$>

Sujets connexes

fprintf
printf
snprintf
sprintf
va_end
va_list
va_start
vfprintf_s
vprintf_s
vsnprintf_s
vsprintf_s


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