Se connecter
Se connecter
Inscription
Mot de passe perdu
Connexion:
[Actualités]
Nvidia prévient d'une pénurie de GPU ce trimestre, avec une reprise début 2025
[Actualités]
Les Technos #469 : Un jour sans fin
[Actualités]
Test Farming Simulator 25 (PS5) - Des innovations intéressantes mais des perfor...
[Actualités]
Qualcomm souhaite réduire davantage les prix des PC Windows basés sur ARM
[Actualités]
Finalement, Google préparerait une nouvelle tablette mais la Pixel Tablet 2 ser...
[Actualités]
Windows 10 version 22H2 : erreur de mise à jour et de désinstallation
[Actualités]
OpenAI prépare désormais son propre navigateur
[Actualités]
WhatsApp bat Telegram : les transcriptions des messages vocaux arrivent pour tou...
[Actualités]
Unreal et Unreal Tournament désormais gratuits sur Internet Archive
[Actualités]
Windows 10 : Microsoft affiche des publicités en plein écran pour les PC équi...
[Articles]
Dungeons 4 - Nintendo Switch Edition
[Articles]
The Bridge Curse 2 : The Extrication
[Articles]
Farmagia
[Articles]
I*CHU: Chibi Edition
[Articles]
Farming Simulator 25
[Articles]
Goblin Slayer -Another Adventurer- Nightmare Feast
[Articles]
Deel lance des programmes en marque blanche et pour les revendeurs pour plus de ...
[Articles]
ESET Research : WolfsBane, nouvelle porte dérobée de cyber-espionnage Linux cr...
[Articles]
Devoteam présente son nouveau plan stratégique « AMPLIFY » avec un fort acce...
[Articles]
LEGO Horizon Adventures
Actualités
Lettre d'information
Proposer une actualité
Archives
Actualités
Articles
Programmation
Press Release
Matériel
Logiciels
Livres
Interviews
Derniers commentaires
Jeux Vidéos
XBox One
XBox 360
Wii U
PSP
PS4
PS3
PC
DS
GameCube
3DS
Forum
Derniers messages
Informatique
Fun
Divers
Logithèque
Blogs
Divers
A Propos
Annonceurs
Contact
Recherche
RSS
Editer un article
Titre
Mots Clés
Texte
[size=18] [b]Nom[/b] [/size] printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf - Formatage des sorties. [size=18] [b]Résumé[/b] [/size] [b]#include
[/b] [b][i]int printf (const char * format , ...);[/i][/b] [b][/b] [b][i]int fprintf (FILE * stream , const char * format , ...);[/i][/b] [b][/b] [b][i]int sprintf (char * str , const char * format , ...);[/i][/b] [b][/b] [b][i]int snprintf (char * str , size_t size , const char * format , ...);[/i][/b] [b]#include
[/b] [b][i]int vprintf (const char * format , va_list ap );[/i][/b] [b][/b] [b][i]int vfprintf (FILE * stream , const char * format , va_list ap );[/i][/b] [b][/b] [b][i]int vsprintf (char * str , const char * format , va_list ap );[/i][/b] [b][/b] [b][i]int vsnprintf (char * str , size_t size , const char * format , va_list ap );[/i][/b] [size=18] [b]Description[/b] [/size] Les fonctions de la famille [b]printf[/b] produisent des sorties en accord avec le [i]format[/i] décrit plus bas. Les fonctions [b]printf[/b] et [b]vprintf[/b] écrivent leur sortie sur [b]stdout ,[/b] le flux de sortie standard. [b]fprintf[/b] et [b]vfprintf[/b] écrivent sur le flux [b]stream indiqué.[/b] [b]sprintf ,[/b] [b]snprintf , [/b] [b]vsprintf[/b] et [b]vsnprintf[/b] écrivent leurs sorties dans la chaîne de caractères [b] str .[/b] Les fontions [b]vprintf ,[/b] [b]vfprintf ,[/b] [b]vsprintf ,[/b] [b]vsnprintf[/b] sont équivalentes aux fonctions [b]printf ,[/b] [b]fprintf ,[/b] [b]sprintf ,[/b] [b]snprintf ,[/b] respectivement, mais elles emploient un tableau va_list à la place d'un nombre variable d'arguments. Ces fonctions n'appellent pas la macro [b]va_end ,[/b] aussi la valeur de [i]ap[/i] est-elle indéfinie après l'appel. Les applications devraient invoquer [i]va_end(ap)[/i] elles-mêmes à la suites de ces routines. Ces huit fonctions créent leurs sorties sous le contrôle d'une chaîne de [i]format[/i] qui indique les conversions à apporter aux arguments suivants (ou accessibles à travers les arguments de taille variable de [b]stdarg (3)).[/b] [b]Valeur renvoyée[/b] Ces fonctions renvoient le nombre de caractères imprimés, sans compter le caractère nul `e0' final dans les chaînes. Les fonctions [b]snprintf et vsnprintf[/b] n'écrivent pas plus de [i]size[/i] octets (y compris le 'e0' final). Si la sortie a été tronquée à cause de la limite, la valeur de retour est le nombre de caractères (sans le 'e0' final) qui auraient été écrits dans la chaîne s'il y avait eu suffisament de place. Ainsi une valeur de retour [i]size[/i] ou plus signifie que la sortie a été tronquée. (Voir aussi la section NOTES plus bas). Si une erreur de sortie s'est produite, une valeur négative est renvoyée. [b]ChaÎne de format[/b] Le format de conversion est indiqué par une chaîne de caractères, commençant et se terminant dans son état de décalage initial. La chaîne de format est composée d'indicateurs : les caractères ordinaires (différents de [b]% ),[/b] qui sont copiés sans modification sur la sortie, et les spécifications de conversion, qui sont mises en correspondances avec les arguments suivants. Les spécifications de conversion sont introduites par le caractère [b]% ,[/b] et se terminent par un [b]indicateur de conversion .[/b] Entre eux peuvent se trouver (dans l'ordre), zéro ou plusieurs [b]attributs ,[/b] une valeur optionnelle de [b]largeur minimal de champ ,[/b] une valeur optionnelle de [b]précision ,[/b] et un éventuel [b]modificateur de longueur .[/b] Les arguments doivent correspondre correctement (après les promotions de types) avec les indicateurs de conversion. Par défaut les arguments sont pris dans l'ordre indiqué, où chaque '*' et chaque indicateur de conversion réclament un nouvel argument (et où l'insuffisance en arguments est une erreur. On peut aussi préciser explicitement quel argument prendre, en écrivant, à chaque conversion, `%m$' au lieu de `%', et `*m$' au lieu de `*'. L'entier décimal m indique la position dans la liste d'arguments, l'indexation commençant à 1. Ainsi,[table][row][col] [/col][col] .nf printf ("%*d", width, num); .fi[/col][/row][/table] et[table][row][col] [/col][col] .nf printf ("%2$*1$d", width, num); .fi[/col][/row][/table] sont équivalents. La seconde notation permet de répéter plusieurs fois le même argument. Le standard C99 n'autorise pas le style utilisant `$', qui provient des Spécifications Single Unix. Si le style avec `$' est utilisé, il faut l'employer pour toutes conversions prenant un argument, et pour tous les arguments de largeur et de précision, mais on peut le mélanger avec des formats `%%' qui ne consomment pas d'arguments. Il ne doit pas y avoir de sauts dans les numéros des arguments spécifiés avec `$'. Par exemple si les arguments 1 et 3 sont spécifiés, l'argument 2 doit aussi être mentionné quelque part dans la chaîne de format. Pour certaines conversions numériques, un caractère de séparation décimale (le point par défaut) est utilisé, ainsi qu'un caractère de regroupement par milliers '. Les véritables caractères dépendent de la localisation LC_NUMERIC. La localisation POSIX utilise `.' comme séparateur décimal, et n'a pas de caractère de regroupement. Ainsi,[table][row][col] [/col][col] .nf printf ("%'.2f", 1234567.89); .fi[/col][/row][/table] s'affichera comme 1234567.89 dans la localisation POSIX, 1234567,89 en localisation fr_FR, et 1.234.567,89 en localisation da_DK. [b]CaractÈre dattribut[/b] Le caractère % peut être éventuellement suivi par un ou plusieurs attributs suivants : [b]#[/b] [table][row][col] [/col][col]indique que la valeur doit être convertie en une autre forme. Pour la conversion [b]o[/b] le premier caractère de la chaîne de sortie vaudra zéro (en ajoutant un préfixe 0 si ce n'est pas déjà un zéro). Pour les conversions [b]x[/b] et [b]X[/b] une valeur non nulle reçoit le préfixe `0x' (ou `0X' pour l'indicateur [b]X ).[/b] Pour les conversions [b]a ,[/b] [b]A ,[/b] [b]e ,[/b] [b]E ,[/b] [b]f ,[/b] [b]g ,[/b] et [b]G[/b] le résultat contiendra toujours un point décimal même si aucun chifre ne le suit (normalement, un point décimal n'est présent avec ces conversions que si des décimales le suivent). Pour les conversions [b]g[/b] et [b]G[/b] les zéros en tête ne sont pas éliminés, contrairement au comportement habituel. Pour les autres conversions, cet attribut n'a pas d'effet.[/col][/row][/table] [b]&0[/b] [table][row][col] [/col][col]indique le remplissage avec des zéros. Pour les conversions [b]d ,[/b] [b]i ,[/b] [b]o ,[/b] [b]u ,[/b] [b]x ,[/b] [b]X ,[/b] [b]a ,[/b] [b]A ,[/b] [b]e ,[/b] [b]E ,[/b] [b]f ,[/b] [b]F ,[/b] [b]g ,[/b] et [b]G ,[/b] la valeur est complétée à gauche avec des zéros plutot qu'avec des espaces. Si les attributs [b]&0[/b] et [b]-[/b] apparaissent ensemble, l'attribut [b]&0[/b] est ignoré. Si une précision est fournie avec une conversion numérique [b] ( d ,[/b] [b]i ,[/b] [b]o ,[/b] [b]u ,[/b] [b]x ,[/b] et [b]X ),[/b] l'attribut [b]&0[/b] est ignoré. Pour les autres conversions, le comportement est indéfini.[/col][/row][/table] [b]-[/b] [table][row][col] [/col][col]indique que la valeur doit être justifiée sur la limite gauche du champ (par défaut elle l'est à droite). Sauf pour la conversion [b]n ,[/b] les valeurs sont complétées à droite par des espaces, plutôt qu'a gauche par des zéros ou des blancs. Un attribut [b]-[/b] surcharge un attribut [b]&0[/b] si les deux sont fournis.[/col][/row][/table] [b]' '[/b] [table][row][col] [/col][col](un espace) indique qu'un espace doit être laissé avant un nombre positif (ou une chaîne vide) produit par une conversion signée[/col][/row][/table] [b]+[/b] [table][row][col] [/col][col]indique que le signe doit toujours être imprimé avant un nombre produit par une conversion signée. Un attribut [b]+[/b] surcharge un attribut 'espace' si les deux sont fournis.[/col][/row][/table] Les cinq caractères d'attributs ci-dessus sont définis dans le standard C, les spécifications SUSv2 en ajoute un : [b]'[/b] [table][row][col] [/col][col]Pour les conversions décimales [b] ( i ,[/b] [b]d ,[/b] [b]u ,[/b] [b]f ,[/b] [b]g ,[/b] [b]G )[/b] indique que les chiffres d'un argument numérique doivent être groupés par millier en fonction de la localisation. Remarquez que de nombreuses versions de [b]gcc[/b] n'accepte pas cet attribut et déclencheront un avertissement (warning). SUSv2 n'inclue pas %'F.[/col][/row][/table] La GlibC 2.2 ajoute un caractère d'attribut supplémentaire. [b]I[/b] [table][row][col] [/col][col]Pour les conversions décimales [b] ( i ,[/b] [b]d ,[/b] [b]u )[/b] la sortie emploie les chiffres alternatifs de la localisation s'il y en a.[/col][/row][/table] [b]Largeur de champ[/b] Un nombre optionnel ne commençant pas par un zéro, peut indiquer une largeur minimale de champ. Si la valeur convertie occupe moins de caractères que cette largeur, elle sera complétée par des espaces à gauche (ou à droite si l'attribut d'alignement à gauche a été fourni). À la place de la chaîne représentant le nombre décimal, on peut écrire `*' ou `*m$' (m étant entier) pour indiquer que la largeur du champ est fournie dans l'argument suivant, ou dans le m-ième argument, respectivement. L'argument fournissant la largeur doit être de type [b]int .[/b] Une largeur négative est considéré comme l'attribut `-' vu plus haut suivi d'une largeur positive. En aucun cas une largeur trop petite ne provoque la troncature du champ. Si le résultat de la conversion est plus grand que la largeur indiquée, le champ est élargi pour contenir le résultat. [b]PrÉcision[/b] Une précision eventuelle, sous la forme d'un point (`&.') suivi par un nombre. À la place de la chaîne représentant le nombre décimal, on peut écrire `*' ou `*m$' (m étant entier) pour indiquer que la précision est fournie dans l'argument suivant, ou dans le m-ième argument, respectivement. L'argument fournissant la précision doit être de type [b]int .[/b] Si la précision ne contient que le caractère `.', ou une valeur négative, elle est considérée comme nulle. Cette précision indique un nombre minimum de chiffres à faire apparaître lors des conversions [b]d ,[/b] [b]i ,[/b] [b]o ,[/b] [b]u ,[/b] [b]x ,[/b] et [b]X ,[/b] le nombre de décimales à faire apparaître pour les conversions [b]a ,[/b] [b]A ,[/b] [b]e ,[/b] [b]E ,[/b] [b]f,[/b] et [b]F ,[/b] le nombre maximum de chiffres significatifs pour [b]g[/b] et [b]G ,[/b] et le nombre maximum de caractères à imprimer depuis une chaîne pour les conversions [b]S[/b] et [b]s .[/b] [b]Modificateur de longueur[/b] Ici, une conversion entière correspond à [b]d ,[/b] [b]i ,[/b] [b]o ,[/b] [b]u ,[/b] [b]x ,[/b] ou [b]X .[/b] [b]hh[/b] [table][row][col] [/col][col]La conversion entière suivante correspond à un [i]signed char[/i] ou [b]unsigned char ,[/b] ou la conversion [b]n[/b] suivante correspond à un argument pointeur sur un [b]signed char .[/b] [/col][/row][/table] [b]h[/b] [table][row][col] [/col][col]La conversion entière suivante correspond à un [i]short int[/i] ou [b]unsigned short int ,[/b] ou la conversion [b]n[/b] suivante correspond à un argument pointeur sur un [b]short int .[/b] [/col][/row][/table] [b]l[/b] [table][row][col] [/col][col](elle) La conversion entière suivante correspond à un [i]long int[/i] ou [b]unsigned long int ,[/b] ou la conversion [b]n[/b] suivante correspond à un pointeur sur un [b]long int ,[/b] ou la conversion [b]c[/b] suivante correspond à un argument [b]wint_t ,[/b] ou encore la conversion [b]s[/b] suivante correspond à un pointeur sur un [b]wchar_t .[/b] [/col][/row][/table] [b]ll[/b] [table][row][col] [/col][col](elle-elle) La conversion entière suivante correspond à un [b]long long int ,[/b] ou [b]unsigned long long int ,[/b] ou la conversion [b]n[/b] suivante correspond à un pointeur sur un [b]long long int .[/b] [/col][/row][/table] [b]L[/b] [table][row][col] [/col][col]La conversion [b]a ,[/b] [b]A ,[/b] [b]e ,[/b] [b]E ,[/b] [b]f ,[/b] [b]F ,[/b] [b]g ,[/b] ou [b]G[/b] suivante correspond à un argument [b]long double .[/b] (C99 autorise %LF mais pas SUSv2).[/col][/row][/table] [b]q [/b] [table][row][col] [/col][col](`quad' BSD 4.4 et Linux sous libc5 seulement, ne pas utiliser) Il s'agit d'un synonyme pour [b]ll .[/b][/col][/row][/table] [b]j[/b] [table][row][col] [/col][col]La conversion entière suivante correspond à un argument [i]intmax_t[/i] ou [b]uintmax_t .[/b] [/col][/row][/table] [b]z[/b] [table][row][col] [/col][col]La conversion entière suivante correspond à un argument [i]size_t[/i] ou [b]ssize_t .[/b] (La bibliothèque libc5 de Linux proposait l'argument [b]Z[/b] pour cela, ne pas utiliser).[/col][/row][/table] [b]t[/b] [table][row][col] [/col][col]La conversion entière suivante correspond à un argument [b]ptrdiff_t .[/b] [/col][/row][/table] Les spécifications SUSv2 ne mentionnent que les modificateurs de longueur [b]h[/b] (dans [b]hd ,[/b] [b]hi ,[/b] [b]ho ,[/b] [b]hx ,[/b] [b]hX ,[/b] [b]hn ),[/b] [b]l[/b] (dans [b]ld ,[/b] [b]li ,[/b] [b]lo ,[/b] [b]lx ,[/b] [b]lX ,[/b] [b]ln ,[/b] [b]lc ,[/b] [b]ls )[/b] et [b]L[/b] (dans [b]Le ,[/b] [b]LE ,[/b] [b]Lf ,[/b] [b]Lg ,[/b] [b]LG ).[/b] [b]Indicateur de conversion[/b] Un caractère indique le type de conversion à apporter. Les indicateurs de conversion, et leurs significations sont : [b]d , i[/b] [table][row][col] [/col][col]L'argument [i]int[/i] est convertie en un chiffre décimal signé. La précision, si elle est mentionné, correspond au nombre minimal de chiffres qui doivent apparaître. Si la conversion fournit moins de chiffres, le résultat est rempli à gauche avec des zéros. Par défaut la précision vaut 1. Lorsque 0 est converti avec une précision valant 0, la sortie est vide.[/col][/row][/table] [b]o , u , x , X[/b] [table][row][col] [/col][col]L'argument [i]unsigned int[/i] est converti en un chiffre octal non-signé [b] ( o ),[/b] un chiffre décimal non-signé [b] ( u ),[/b] un chiffre héxadécimal non-signé [b] ( x[/b] et [b]X ).[/b] Les lettres [b]abcdef[/b] sont utilisées pour les conversions avec [b]x ,[/b] les lettres [b]ABCDEF[/b] sont utilisées pour les conversions avec [b]X .[/b] La précision, si elle est indiquée, donne un nombre minimal de chiffres à faire apparaître. Si la valeur convertie nécessite moins de chiffres, elle est complétée à gauche avec des zéros. La précision par défaut vaut 1. Lorsque 0 est converti avec une précision valant 0, la sortie est vide.[/col][/row][/table] [b]e , E[/b] [table][row][col] [/col][col]L'argument réel, de type [b]double ,[/b] est arrondi et présenté avec la notation scientifique .if w'*(Pm'=0 .ds Pm ± [b] [-]c &. ccc e *(Pmcc[/b] dans lequel se trouve un chiffre avant le point, puis un nombre de décimales égal à la précision demandée. Si la précision n'est pas indiquée, l'affichage contiendra 6 décimales. Si la précision vaut zéro, il n'y a pas de point décimal. Une conversion [b]E[/b] utilise la lettre [b]E[/b] (plutôt que [b]e )[/b] pour introduire l'exposant. Celui-ci contient toujours au moins deux chiffres. Si la valeur affichée est nulle, son exposant est 00.[/col][/row][/table] [b]f , F[/b] [table][row][col] [/col][col]L'argument réel, de type [b]double ,[/b] est arrondi, et présenté avec la notation classique [b] [-]ccc &. ccc,[/b] où le nombre de décimales est égal à la précision réclamée. Si la précision n'est pas indiquée, l'affichage se fera avec 6 décimales. Si la précision vaut zéro, aucun point n'est affiché. Lorsque le point est affiché, il y a toujours au moins un chiffre devant. SUSv2 ne mentionne pas [b]F[/b] et dit qu'il existe une chaîne de caractères représentant l'infini ou NaN. Le standard C99 précise `[-]inf' ou `[-]infinity' pour les infinis, et une chaîne commençant par `nan' pour NaN dans le cas d'une conversion [b]f ,[/b] et les chaînes `[-]INF' `[-]INFINITY' `NAN*' pour une conversion [b]F .[/b] [/col][/row][/table] [b]g , G[/b] [table][row][col] [/col][col]L'argument réel, de type [b]double ,[/b] est converti en style [b]f[/b] ou [b]e[/b] (ou [b]E[/b] pour la conversion [b]G )[/b] La précision indique le nombre de décimales significatives. Si la précision est absente, une valeur par défaut de 6 est utilisée. Si la précision vaut 0, elle est considérée comme valant 1. La notation scientifique [b]e[/b] est utilisée si l'exposant est inférieur à -4 ou supérieur ou égal à la précision démandée. Les zéros en fin de partie décimale sont supprimés. Un point decimal n'est affiché que s'il est suivi d'au moins un chiffre.[/col][/row][/table] [b]a , A[/b] [table][row][col] [/col][col](C99 mais pas SUSv2). Pour la conversion [b]a ,[/b] l'argument de type [i]double[/i] est transformé en notation hexadécimale (avec les lettres abcdef) dans le style [b] [-] 0x h &. hhhh p *(Pmd;[/b] Pour la conversion [b]A ,[/b] le préfixe [b]0X ,[/b] les lettres ABCDEF et le séparateur d'exposant [b]P[/b] sont utilisés. Il y a un chiffre hexadécimal avant la virgule, et le nombre de chiffres ensuite est égal à la précision. La précision par défaut suffit pour une représentation exacte de la valeur, si une représentation exacte est possible en base 2. Sinon elle est suffisament grande pour distinguer les valeurs de type [b]double .[/b] Le chiffre avant le point décimal n'est pas spécifié pour les nombres non-normalisés, et il non-nul pour les nombres normalisés.[/col][/row][/table] [b]c[/b] [table][row][col] [/col][col]S'il n'y a pas de modificateur [b]l ,[/b] l'argument entier, de type [b]int ,[/b] est converti en un [b]unsigned char ,[/b] et le caractère correspondant est affiché. Si un modificateur [b]l[/b] est présent, l'argument de type [i]wint_t[/i] (caractère large) est converti en séquence multi-octet par un appel à [b]wctomb ,[/b] avec un état de conversion débutant dans l'état initial. La chaîne multi-octet résultante est écrite.[/col][/row][/table] [b]s[/b] [table][row][col] [/col][col]S'il n'y a pas de modificateur [b]l ,[/b] l'argument de type [i]const char *[/i] est supposé être un pointeur sur un tableau de caractères (pointeur sur une chaîne). Les caractères du tableau sont écrits jusqu'au caractère [b]NUL[/b] final, non compris. Si une précision est indiquée, seul ce nombre de caractères sont écrits. Si une précision est fournie, il n'y a pas besoin de caractère nul. Si la précision n'est pas donnée, ou si elle est supérieure à la longueur de la chaîne, le caractère [b]NUL[/b] final est nécessaire. Si un modificateur [b]l[/b] est présent, l'argument de type [i]const wchar_t *[/i] est supposé être un pointeur sur un tableau de caractères larges. Les caractères larges du tableau sont convertis en une séquence de caractères multi-octets (chacun par un appel de [b]wctomb ,[/b] avec un état de conversion dans l'état initial avant le premier caractère large), ceci jusqu'au caractère large nul final compris. Les caractères multi-octets résultants sont écris jusqu'à l'octet nul final (non compris). Si une précision est fournie, il n'y a pas plus d'octets écrits que la précision indiquée, mais aucun caractère multi-octet n'est écrit partiellement. Remarquez que la précision concerne le nombre [i]d'octets[/i] écrits, et non pas le nombre de [i]caractères larges[/i] ou de [b]positions d'écrans .[/b] La chaîne doit contenir un caractère large nul final, sauf si une précision est indiquée, suffisament petite pour que le nombre d'octets écrits la remplisse avant la fin de la chaîne.[/col][/row][/table] [b]C[/b] [table][row][col] [/col][col](dans SUSv2 mais pas dans C99) Synonyme de [b]lc .[/b] Ne pas utiliser.[/col][/row][/table] [b]S[/b] [table][row][col] [/col][col](dans SUSv2 mais pas dans C99) Synonyme de [b]ls .[/b] Ne pas utiliser.[/col][/row][/table] [b]p[/b] [table][row][col] [/col][col]L'argument pointeur, du type [i]void *[/i] est affiché en héxadécimal, comme avec [b]%#x[/b] ou [b] %#lx .[/b][/col][/row][/table] [b]n[/b] [table][row][col] [/col][col]Le nombre de caractères déjà écrits est stocké dans l'entier indiqué par l'argument pointeur de type [b]int * .[/b] Aucun argument n'est converti.[/col][/row][/table] [b]%[/b] [table][row][col] [/col][col]Un caractère `%' est écrit. Il n'y a pas de conversion. L'indicateur complet est `%%'.[/col][/row][/table] [size=18] [b]Exemples[/b] [/size] [b][/b] .if w'*(Pi'=0 .ds Pi pi Pour afficher *(Pi avec cinq décimales :[table][row][col] [/col][col] .nf #include
#include
fprintf (stdout, "pi = %.5fen", 4 * atan (1.0)); .fi[/col][/row][/table] Pour afficher une date et une heure sous la forme `Sunday, July 3, 23:15', ou [i]jour_semaine[/i] et [i]mois[/i] sont des pointeurs sur des chaînes :[table][row][col] [/col][col] .nf #include
fprintf (stdout, "%s, %s %d, %.2d:%.2den", jour_semaine, mois, jour, heure, minute); .fi[/col][/row][/table] De nombreux pays utilisent un format de date différent, comme jour-mois_année. Une version internationale doit donc être capable d'afficher les arguments dans l'ordre indiqué par le format :[table][row][col] [/col][col] .nf #include
fprintf(stdout, format, jour_semaine, mois, day, hour, min); .fi[/col][/row][/table] où le [i]format[/i] dépend de la localisation et peut permuter les argument. Avec la valeur[table][row][col] [/col][col] .nf "%1$s, %3$d. %2$s, %4$d:%5$.2den" .fi[/col][/row][/table] On peut obtenir `Dimanche, 3 Juillet, 23:15'. Pour allouer une chaîne de taille suffisante et écrire dedans (code correct aussi bien pour GlibC 2.0 que GlibC 2.1) :[table][row][col] [/col][col] .nf #include
#include
#include
char * make_message(const char *fmt, ...) { /* Supposons que 100 octets suffisent. */ int n, size = 100; char *p; va_list ap; if ((p = malloc (size)) == NULL) return NULL; while (1) { /* Essayons avec l'espace alloué. */ va_start(ap, fmt); n = vsnprintf (p, size, fmt, ap); va_end(ap); /* Si ça marche, renvoyer la chaîne. */ if (n > -1 && n < size) return p; /* Sinon réessayer avec plus de place */ if (n > -1) /* GlibC 2.1 */ size = n+1; /* ce qu'il fallait */ else /* GlibC 2.0 */ size *= 2; /* deux fois plus */ if ((p = realloc (p, size)) == NULL) return NULL; } } .fi[/col][/row][/table] [size=18] [b]Notes[/b] [/size] L'implémentation des fonctions [b]snprintf[/b] et [b]vsnprintf[/b] de la GlibC se conforme au standard C99, et se comporte comme décrit plus haut depuis la GlibC 2.1. Jusqu'à la GlibC 2.0.6, elles renvoyaient -1 si la sortie avait été tronquée. [size=18] [b]Conformité[/b] [/size] Les fonctions [b]fprintf ,[/b] [b]printf ,[/b] [b]sprintf ,[/b] [b]vprintf ,[/b] [b]vfprintf ,[/b] et [b]vsprintf[/b] sont conformes à ANSI X3.159-1989 (``ANSI C'') et ISO/IEC 9899:1999 (``ISO C99''). Les fonctions [b]snprintf ,[/b] et [b]vsnprintf [/b] sont conformes à ISO/IEC 9899:1999. En ce qui concerne la valeur de retour de [b]snprintf ,[/b] SUSv2 et C99 sont en contradiction : lorsque [b]snprintf[/b] est appelée avec un argument [b]size = 0[/b] lors SUSv2 précise une valeur de retour indéterminée, autre que 1, alors que C99 autorise [i]str[/i] à être NULL dans ce cas, et réclame en valeur de retour (comme toujours) le nombre de caractères qui auraient été écrits si la chaîne de sortie avait été assez grande. La bibliothèque libc4 de Linux connaissait les 5 attributs standards du C. Elle connaissait les modificateurs de longueur h, l, L et les conversions cdeEfFgGinopsuxX, où F était synonyme de f. De plus elle acceptait D, O, U comme synonymes de ld, lo et lu. (Ce qui causa de sérieux bogues par la suite lorsque le support de %D disparut). Il n'y avait pas de séparateur décimal dépendant de la localisation, pas de séparateur des milliers, par de NaN ou d'infinis, et pas de %m$ ni *m$. La bibliothèque libc5 de Linux connaissait les 5 attributs standards C, l'attribut ', la localisation, %m$ et *m$. Elle connaissait les modificateurs de longueur h, l, L, Z, q, mais acceptait L et q pour les "long double" et les "long long integer" (ce qui est un bogue). Elle ne reconnaissait plus FDOU, mais ajoutait le caractère de conversion [b]m ,[/b] qui affiche [b]strerror (errno) .[/b] La bibliothèque GlibC 2.0 ajouta les caractères de conversion C et S. La bibliothèque GlibC 2.1 ajouta les modificateurs de longueur hh, t, z, et les caractères de conversion a, A. La bibliothèque GlibC 2.2. ajouta le caractère de conversion F avec la sémantique C99, et le caractère d'attribut I. [size=18] [b]Historique[/b] [/size] Unix V7 définissait les trois routines [b]printf ,[/b] [b]fprintf ,[/b] [b]sprintf ,[/b] et l'attribut -, la largeur ou la précision *, le modificateur de longueur l, et les conversions doxfegcsu, ainsi que D, O, U, X comme synonymes de ld, lo, lu, lx. Ceci est vrai pour BSD 2.9.1, mais BSD 2.10 avait les attributs #, + et
mais ne mentionnait plus D, O, U, X. BSD 2.11 avait [b]vprintf ,[/b] [b]vfprintf ,[/b] [b]vsprintf ,[/b] et signalait le problème de D, O, U, X. BSD 4.3 Reno avait l'attribut 0, les modificateurs de longueur h et L, ainsi que les conversions n, p, E, G, X (avec sa signification actuelle), et dénonçait D, O, U. BSD 4.4 introduisit les fonctions [b]snprintf[/b] et [b]vsnprintf ,[/b] et le modificateur de longueur q. FreeBSD avait aussi les fonctions [i]asprintf[/i] et [b]vasprintf ,[/b] qui allouaient un buffer assez grand pour [b]sprintf .[/b] Dans la GlibC, il existe des fonctions [i]dprintf[/i] et [i]vdprintf[/i] qui affichent leur résultat sur un descripteur de fichier plutôt qu'un flux. [size=18] [b]Bugs[/b] [/size] Comme [b]sprintf[/b] et [b]vsprintf[/b] ne font pas de suppositions sur la longueur des chaînes, le programme appelant doit s'assurer de ne pas déborder l'espace d'adressage. C'est souvent difficile. Notez que la longueur des chaînes peut varier avec la localisation et être difficilement prévisible. Il faut alors utiliser [b]snprintf[/b] ou [b]vsnprintf[/b] à la place (ou encore [b]asprintf[/b] et [b]vasprintf ).[/b] La libc4.[45] de Linux n'avait pas [b]snprintf ,[/b] mais proposait une bibliothèque libbsd qui contenait un [b]snprintf[/b] équivalent à [b]sprintf ,[/b] c'est à dire qui ignorait l'argument [b]size .[/b] Ainsi, l'utilisation de [b]snprintf[/b] avec les anciennes libc4 pouvait conduire à de sérieux problèmes de sécurité. Un code tel que [b][i]printf( foo ); [/i][/b] indique souvent un bogue, car [i]foo[/i] peut contenir un caractère %. Si [i]foo[/i] vient d'une saisie non sécurisée, il peut contenir %n, ce qui autorise [b]printf[/b] à écrire dans la mémoire, et crée une faille de sécurité. [size=18] [b]Voir aussi[/b] [/size] [b]printf (1),[/b] [b]asprintf (3),[/b] [b]dprintf (3),[/b] [b]wcrtomb (3),[/b] [b]wprintf (3),[/b] [b]scanf (3),[/b] [b]locale (5)[/b] [size=18] [b]Traduction[/b] [/size] Christophe Blaess, 1996-2003.
Fichier
Forum
-
Derniers messages
Bavardages
Aujourd'hui, je rénove ou je construis ^^
Software
problème sur windows 10
Réseaux et Télécom
Administrateur Réseau - Cisco
Réseaux et Télécom
Problème wifi (POE)
Software
Postfix - Need help
Bavardages
Oh râge oh désespoir !
Programmation
Enregistrement client et envoi mail
Software
SÉCURITÉ MACBOOK
Hardware
conseil matos réseau?
Hardware
nVidia Shield Android TV
Actualités
-
Archives
Matériel
Nvidia prévient d'une pénurie de GPU ce trimestre, avec une reprise début 2025
Les Technos
Les Technos #469 : Un jour sans fin
Jeux Vidéos
Test Farming Simulator 25 (PS5) - Des innovations intéressantes mais des performances à revoir
Matériel
Qualcomm souhaite réduire davantage les prix des PC Windows basés sur ARM
Tablettes
Finalement, Google préparerait une nouvelle tablette mais la Pixel Tablet 2 serait abandonnée
Ada
CSS
Cobol
CPP
HTML
Fortran
Java
JavaScript
Pascal
Perl
PHP
Python
SQL
VB
XML
Anon URL
DailyMotion
eBay
Flickr
FLV
Google Video
Google Maps
Metacafe
MP3
SeeqPod
Veoh
Yahoo Video
YouTube
6px
8px
10px
12px
14px
16px
18px
Informaticien.be
- © 2002-2024
Akretio
SPRL - Generated via
Kelare
The Akretio Network:
Akretio
-
Freedelity
-
KelCommerce
-
Votre publicité sur informaticien.be ?