#include <stdio.h> // <cstdio> en C++ #include <stdarg.h> // <cstdarg> en C++
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.
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.
va_list.
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.
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; } |
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 $>
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 :