VSPRINTF |
Imprime dans une chaîne en format à partir de virtuel |
---|---|
Langage C++ | cstdio (stdio.h) |
Syntaxe
int vsprintf(char *str,const char *format,va_list arg) |
Paramètres
Nom | Description | |
---|---|---|
str | Ce paramètre permet d'indiquer la chaîne de caractères ASCIZ recevant les données (tampon). | |
format | Ce paramètre permet d'indiquer le texte à écrire. Il est a noter que un ou plusieurs des spécificateurs suivants peuvent être inclus dans le texte et il utilisera un argument supplémentaire pour chaque spécificateurs : | |
Spécificateur | Description | |
%c | Ce spécificateur indique d'insérer à cette position un caractère contenu dans la liste des arguments après le texte | |
%d | Ce spécificateur indique d'insérer à cette position un entier sous forme décimal contenu dans la liste des arguments après le texte | |
%f | Ce spécificateur indique d'insérer à cette position un nombre à virgule flottante contenu dans la liste des arguments après le texte | |
%i | Ce spécificateur indique d'insérer à cette position un entier contenu dans la liste des arguments après le texte | |
%o | Ce spécificateur indique d'insérer à cette position un entier sous forme octal contenu dans la liste des arguments après le texte | |
%s | Ce spécificateur indique d'insérer à cette position une chaîne de caractères contenu dans la liste des arguments après le texte | |
%x | Ce spécificateur indique d'insérer à cette position un entier sous forme hexadécimal contenu dans la liste des arguments après le texte | |
Il est possible d'ajouter une précision du nombre décimal afficher en insérant le nombre entre le symbole de pourcentage et la lettre. | ||
arg | Ce paramètre permet d'indiquer le pointeur d'argument |
Description
Cette fonction effectue l'écriture de texte selon un certain format à l'aide de paramètre virtuel à partir d'un tampon.
Remarques
- Les fonctions vprintf(), vfprintf() et vsprintf() sont fonctionnellement équivalentes à printf(), fprintf() et sprintf(), respectivement, sauf que la liste de paramètres a été remplacée par un pointeur vers une liste de paramètres. Ce pointeur doit être de type va_list, étant défini dans l'entête cstdarg (ou le fichier d'entête C stdarg.h).
- Définition et utilisation : La fonction vsprintf fait partie de la bibliothèque standard C et est utilisée pour formater une chaîne de caractères en utilisant une liste d'arguments variable. Elle fonctionne de manière similaire à sprintf, mais prend un va_list comme argument, ce qui permet de traiter des listes de paramètres sans avoir à les spécifier directement. Cela la rend particulièrement utile dans des contextes où le nombre d'arguments peut varier, par exemple dans des fonctions acceptant des arguments pour des messages de journal de bord ou des messages d'erreur.
- Utilisation avec va_list : L'utilisation de vsprintf permet de passer des arguments sous forme de va_list, ce qui est pratique dans les fonctions devant gérer un nombre variable de paramètres. Cela facilite la manipulation des arguments sans avoir à les lister individuellement. Par exemple, dans une fonction de journal de bord personnalisée, vous pouvez utiliser va_start pour initialiser un va_list et ensuite appeler vsprintf pour formater le message avant de l'envoyer à un fichier ou à la sortie standard.
- Gestion des erreurs : Contrairement à certaines autres fonctions de formatage, vsprintf ne gère pas les erreurs de manière explicite. Elle retourne le nombre de caractères écrits dans le tampon, ou un nombre négatif en cas d'erreur. Cela peut être problématique, car une écriture dans un tampon non alloué peut entraîner un comportement indéfini. Il est donc important de s'assurer que le tampon passé à vsprintf est suffisamment grand pour contenir la chaîne formatée, afin d'éviter les débordements de mémoire qui peuvent causer des vulnérabilités de sécurité.
- Comparaison avec sprintf : La principale différence entre vsprintf et sprintf réside dans la manière dont les paramètres sont passés. sprintf accepte directement une liste d'arguments, tandis que vsprintf travaille avec un va_list, ce qui le rend plus flexible dans certaines situations. En général, vsprintf est préférable dans des fonctions encapsulant la logique de formatage et doivent accepter un nombre variable de paramètres, tandis que sprintf est plus simple à utiliser pour des cas d'utilisation simples.
- Applications pratiques : vsprintf est souvent utilisé dans des systèmes de journal de bord, des formats de messages personnalisés, ou tout autre scénario où le formatage dynamique est nécessaire. Par exemple, dans une application de journalisation, vsprintf peut être utilisé pour construire des messages d'erreur détaillés avec des informations variables. En encapsulant vsprintf dans une fonction de journal de bord, vous pouvez standardiser la façon dont les messages sont générés, ce qui améliore la cohérence et la maintenabilité du code.
- Limitations : Une des limitations notables de vsprintf est qu'elle ne limite pas la taille de la chaîne de caractères générée. Cela signifie que si le tampon n'est pas suffisamment grand pour contenir la chaîne formatée, cela peut entraîner des débordements de mémoire. Pour pallier cela, il est recommandé d'utiliser vsnprintf, permettant de spécifier la taille maximale du tampon. Cette caractéristique rend vsprintf moins sécurisée dans les environnements critiques, où la gestion des débordements de mémoire est essentielle.
- Portabilité : Comme vsprintf fait partie de la bibliothèque standard C, elle est généralement portable entre différentes plateformes et compilateurs. Cependant, il est toujours bon de consulter la documentation spécifique à votre environnement pour connaître les particularités pouvant affecter le comportement de la fonction. En utilisant vsprintf, vous pouvez être assuré que votre code fonctionnera de manière cohérente sur la plupart des systèmes, tant que les bibliothèques standard sont respectées.
Exemple
Voici divers exemple d'affichages de format :

- #include <stdio.h>
- #include <stdlib.h>
- #include <stdarg.h>
-
- void MyVSPrintF(const char * format, ...) {
- va_list args;
- char buffer[255];
- va_start(args, format);
- vsprintf(buffer,format, args);
- puts(buffer);
- va_end(args);
- }
-
- int main () {
- MyVSPrintF("Boujour!");
- MyVSPrintF("Entier %%i = %i",15);
- MyVSPrintF("Hexadecimal %%x = %x",16);
- MyVSPrintF("Octal %%o = %o",16);
- MyVSPrintF("Chaine de caracteres %%s = %s","message");
- MyVSPrintF("Reel %%f = %f",123.45);
- MyVSPrintF("Reel %%f = %.2f",123.45);
- return 0;
- }
on obtiendra le résultat suivant :
Boujour!Entier %i = 15
Hexadecimal %x = 10
Octal %o = 20
Chaine de caracteres %s = message
Reel %f = 123.450000
Reel %f = 123.45
Voir également
Langage de programmation - C++ - Référence procédures et fonctions - printf
Langage de programmation - C++ - Référence procédures et fonctions - va_arg
Langage de programmation - C++ - Référence procédures et fonctions - va_end
Langage de programmation - C++ - Référence procédures et fonctions - va_start
Langage de programmation - C - Référence procédures et fonctions - vsprintf
Références
Langage C, Edition Micro-Application, Gehard Willms, 2001, ISBN: 2-7429-2008-0, page 736.
Borland C++ for Windows 4.0, Library Reference, Edition Borland, 1993, Part # BCP1240WW21772, page 293.