SPRINTF |
Chaine d'impression formatté |
---|---|
Langage C++ | cstdio (stdio.h) |
Syntaxe
int sprintf(char *tampon,const char *texte,...) |
Paramètres
Nom | Description | |
---|---|---|
tampon | Ce paramètre permet d'indiquer le tampon recevant les données | |
texte | Ce paramètre permet d'indiquer le texte à écrire dans le tampon. 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. |
Retour
Valeur | Description |
---|---|
0 ou supérieur | Ces valeurs permettent d'indiquer la longueur du tampon généré après le formatage. |
Description
Cette fonction permet d'effectuer l'écriture de texte selon un certain format à partir d'un tampon.
Remarques
- Il faut s'assurer que le tampon recevant les données soit assez grand pour recevoir le contenu demandé. Toutefois, il est très difficile d'anticiper la taille qu'aura le résultat avec le formatage de données. Cependant, on devrait prévoir au moins 6 caractères pour un entier court, 20 caractères par un entier long, 30 pour des nombres réels et faire un calcul avec strlen dans le cas d'une chaîne de caractères à y introduire.
- Le comportement de cette fonction est similaire à la fonction «printf» sauf qu'il retourne son résultat dans une chaîne de caractères plutôt que de l'afficher.
- Après le paramètre de formatage, la fonction attend au moins un nombre égale ou supérieur de paramètres que le nombre de «%i», «%c»,... réunit.
- Il peut être judicieux d'utiliser plusieurs fois cette fonction pour préparer par morceaux de pièces trop complexes pour une simple fonction «printf».
- Contrairement à ce que l'on pourrait croire, cette fonction n'est pas définie dans l'entête «cstring» mais plutôt dans «cstdio».
- Si votre compilateur de langage de programmation C ou C++ supporte la fonction «snprintf», il serait plutôt préférable d'utiliser cette fonction. Malheureusement, elle n'a été incluse quand dans le standard C++ de 2011, il n'est donc pas nécessairement supporté sur votre plate-forme.
- Retourne le nombre de caractères écrits : sprintf renvoie un entier correspondant au nombre de caractères écrits (sans compter le caractère nul \0 de fin). Exemple :
- Risque de dépassement de mémoire (Buffer Overflow) : sprintf n'effectue aucun contrôle sur la taille du tampon où elle écrit.
Si la chaîne formatée dépasse la capacité du tableau tampon, cela peut entraîner un dépassement de mémoire et potentiellement un comportement indéfini.
Solution : utiliser snprintf, limitant le nombre de caractères écrits :
- snprintf(buffer, sizeof(buffer), "Texte très long %d", 100);
- Ne gère pas directement les types std::string : sprintf fonctionne avec des chaînes de caractères de type char*, mais pas directement avec std::string. Il faut donc utiliser la méthode .c_str() pour extraire un char* :
- Gestion des nombres flottants et précision : sprintf permet de contrôler la précision des nombres à virgule flottante :
- Support des différents formats (décimal, hexadécimal, octal) : sprintf permet d'afficher un entier sous différentes bases :
- Alternative en C++ moderne : std::ostringstream : sprintf est souvent remplacée par std::ostringstream en C++ moderne, étant plus sûr et plus flexible :
- #include <sstream>
- #include <iostream>
- int main() {
- std::ostringstream oss;
- oss << "Valeur : " << 42;
- std::string result = oss.str();
- std::cout << result << std::endl;
- }
- Performance et impact mémoire : sprintf est généralement plus rapide que std::ostringstream, car elle travaille directement avec des tableaux de caractères plutôt qu'avec des objets dynamiques. Cependant, elle est moins sûre et plus difficile à déboguer, notamment lorsqu'il s'agit de grands tampons. Son utilisation est donc recommandée dans des applications critiques en performances, mais avec des précautions pour éviter les erreurs de mémoire.
Ici, len vaudra 10, car la chaîne "Valeur : 42" contient 10 caractères.
De plus, il est préférable d'utiliser std::ostringstream en C++ moderne pour la gestion des chaînes de caractères.
Cela affichera "3.14", car %.2f arrondit à deux chiffres après la virgule. Cela est utile pour formater des nombres monétaires, scientifiques ou des données numériques.
Résultat :
Décimal: 255, Hex: ff, Octal: 377Ceci est particulièrement utile en programmation système et développement embarqué.
Cela évite les problèmes de buffer overflow et facilite la gestion des std::string.
Exemple
Voici divers exemple d'affichages de format :

- #include <iostream>
- #include <cstdio>
-
- int main()
- {
- char Temp[255];
- sprintf(Temp,"Boujour!");
- std::cout << Temp << std::endl;
- sprintf(Temp,"Entier %%i = %i",15);
- std::cout << Temp << std::endl;
- sprintf(Temp,"Hexadecimal %%x = %x",16);
- std::cout << Temp << std::endl;
- sprintf(Temp,"Octal %%o = %o",16);
- std::cout << Temp << std::endl;
- sprintf(Temp,"Chaine de caracteres %%s = %s","message");
- std::cout << Temp << std::endl;
- sprintf(Temp,"Reel %%f = %f",123.45);
- std::cout << Temp << std::endl;
- sprintf(Temp,"Reel %%f = %.2f",123.45);
- std::cout << Temp << std::endl;
- 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 de procédures et fonctions - fprintf
Langage de programmation - C++ - Référence de procédures et fonctions - printf
Langage de programmation - C - Référence de procédures et fonctions - sprintf
Références
Langage C, Edition Micro-Application, Gehard Willms, 2001, ISBN: 2-7429-2008-0, page 734.
Borland C++ for Windows 4.0, Library Reference, Edition Borland, 1993, Part # BCP1240WW21772, page 248.