VSPRINTF |
Imprime dans une chaîne en format à partir de virtuel |
---|---|
Langage C | stdio.h |
Syntaxe
int vsprintf(char *tampon,const char *texte,va_list ptrargument); |
Paramètres
Nom | Description | |
---|---|---|
tampon | Ce paramètre permet d'indiquer la chaîne de caractères ASCIZ recevant les données | |
texte | 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. | ||
ptrargument | 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.
Algorithme
MODULE VSPRINTF(buffer, format, arguments) * Initialiser un pointeur va_list avec les arguments variables Initialiser va_list à arguments * Appeler vsprintf (ou une fonction interne similaire) pour formater la chaîne Appeler vfprintf(dummy_file, format, arguments) * Copier le résultat formaté dans le buffer Copier la chaîne formatée dans buffer * Terminer l'utilisation des arguments variables va_end(va_list) |
Remarques
- Définition et utilité : La fonction vsprintf fait partie de la bibliothèque <stdio.h> et permet de formater une chaîne de caractères dans un tampon de mémoire (au lieu d'afficher le résultat sur la sortie standard). Elle est utilisée pour construire dynamiquement une chaîne formatée en fonction d'un format donné et d'une liste d'arguments variables. Elle est souvent utilisée lorsqu'un formatage est nécessaire avant de transmettre les données à une autre fonction ou de les entreposer.
- Différence avec sprintf : Tandis que sprintf permet de formater directement une chaîne de caractères et de l'écrire dans un tampon, vsprintf fonctionne de la même manière mais prend un objet va_list en entrée plutôt qu'une liste d'arguments individuels. Cela la rend plus appropriée dans les cas où les paramètres sont passés de manière dynamique, comme dans les fonctions traitant des arguments variables.
- Sécurité et risques de débordement : L'utilisation de vsprintf présente des risques de débordement de tampon si le tampon str est trop petit pour contenir la chaîne formatée. C'est l'une des raisons pour lesquelles cette fonction est souvent déconseillée dans des applications modernes, et qu'on préfère utiliser des variantes plus sûres comme vsnprintf, permettant de spécifier la taille maximale du tampon afin d'éviter les dépassements de mémoire.
- Retour de la fonction : Comme sprintf, vsprintf renvoie le nombre de caractères écrits dans le tampon, à l'exclusion du caractère nul de fin de chaîne. En cas d'erreur, elle retourne une valeur négative, ce qui peut être utile pour détecter des problèmes lors du formatage (par exemple, une chaîne trop longue pour le tampon alloué).
- Utilisation avec va_list : vsprintf est souvent utilisée dans des fonctions qui prennent un nombre variable d'arguments, par exemple dans des fonctions de journalisation ou de débogage où un format dynamique est nécessaire. L'objet va_list doit être préparé en amont avec va_start et libéré avec va_end, garantissant ainsi que les arguments sont correctement manipulés.
- Applications typiques : Cette fonction est fréquemment utilisée dans des bibliothèques de gestion de logs ou d'autres mécanismes de débogage, où le nombre et le type des arguments peuvent varier d'une exécution à l'autre. Par exemple, elle permet de formater des messages de journalisation en fonction des informations dynamiques passées à la fonction.
- Compatibilité et portabilité : Bien que largement supportée, vsprintf peut avoir des variations subtiles dans son implémentation en fonction du système et du compilateur. La gestion des caractères et des formats peut également varier, ce qui peut parfois poser des problèmes de portabilité. Pour des applications sensibles à la sécurité et à la robustesse, l'utilisation de variantes plus sûres, comme vsnprintf, est recommandée pour éviter les risques associés aux débordements de tampon.
Exemple
Voici divers exemple d'affichages de format :
Essayer maintenant !
- #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.