printf_s
, _printf_s_l
, wprintf_s
, _wprintf_s_l
Imprime une sortie mise en forme dans le flux de sortie standard. Ces versions de printf
, , _printf_l
, wprintf
, _wprintf_l
ont des améliorations de sécurité, comme décrit dans les fonctionnalités de sécurité dans le CRT.
Syntaxe
int printf_s(
const char *format [,
argument]...
);
int _printf_s_l(
const char *format,
_locale_t locale [,
argument]...
);
int wprintf_s(
const wchar_t *format [,
argument]...
);
int _wprintf_s_l(
const wchar_t *format,
_locale_t locale [,
argument]...
);
Paramètres
format
Contrôle de format.
argument
Arguments facultatifs.
locale
Paramètres régionaux à utiliser.
Valeur retournée
Retourne le nombre de caractères imprimés ou une valeur négative si une erreur se produit.
Notes
La fonction printf_s
met en forme et imprime une série de caractères et de valeurs dans le flux de sortie standard, stdout
. Si les arguments suivent la chaîne format
, la chaîne format
doit contenir des spécifications qui déterminent le format de sortie des arguments.
La principale différence entre printf_s
et printf
est que printf_s
vérifie si la chaîne de format comporte des caractères de mise en forme valides, alors que printf
vérifie uniquement si la chaîne de format est un pointeur Null. Si l’un des case activée échoue, un gestionnaire de paramètres non valide est appelé, comme décrit dans la validation des paramètres. Si l'exécution est autorisée à se poursuivre, la fonction retourne -1 et définit errno
avec la valeur EINVAL
.
Pour plus d’informations sur errno
les codes d’erreur, consultezerrno
, , _doserrno
_sys_errlist
et _sys_nerr
.
printf_s
et fprintf_s
se comportent de la même façon, sauf que l’écriture printf_s
de la sortie au stdout
lieu d’une destination de type FILE
. Pour plus d’informations, consultez , , fwprintf_s
_fprintf_s_l
, _fwprintf_s_l
.fprintf_s
wprintf_s
est une version à caractères larges de printf_s
; format
est une chaîne de caractères larges. wprintf_s
et printf_s
se comportent de la même façon si le flux est ouvert en mode ANSI. printf_s
ne prend pas en charge la sortie vers un flux UNICODE pour l’instant.
Les versions de ces fonctions avec le suffixe _l
sont identiques, sauf qu'elles utilisent les paramètres régionaux passés au lieu des paramètres régionaux du thread actuel.
Mappages de routine de texte générique
TCHAR.H Routine |
_UNICODE et _MBCS non défini |
_MBCS Défini |
_UNICODE Défini |
---|---|---|---|
_tprintf_s |
printf_s |
printf_s |
wprintf_s |
_tprintf_s_l |
_printf_s_l |
_printf_s_l |
_wprintf_s_l |
L’argument format
se compose de caractères ordinaires, de séquences d’échappement et (si des arguments suivent format
) de spécifications de format. Les caractères ordinaires et les séquences d’échappement sont copiés dans stdout
dans leur ordre d’apparition. Par exemple, la ligne
printf_s("Line one\n\t\tLine two\n");
génère la sortie
Line one
Line two
Les spécifications de format commencent toujours par un symbole de pourcentage (%
) et sont lues de gauche à droite. Quand la fonction printf_s
rencontre la première spécification de format (le cas échéant), elle convertit la valeur du premier argument après format
et la sort en conséquence. La deuxième spécification de format entraîne la conversion et la sortie du deuxième argument, et ainsi de suite. S’il y a plus d’arguments que de spécifications de format, les arguments en trop sont ignorés. Les résultats ne sont pas définis s’il n’y a pas suffisamment d’arguments pour toutes les spécifications de format.
Important
Assurez-vous que format
n'est pas une chaîne définie par l'utilisateur.
À compter de Windows 10 version 2004 (build 19041), la printf
famille de fonctions imprime exactement des nombres à virgule flottante pouvant être représentés en fonction des règles IEEE 754 pour l’arrondi. Dans les versions précédentes de Windows, les nombres à virgule flottante qui se terminent exactement par « 5 » sont toujours arrondis. IEEE 754 indique qu’ils doivent arrondir au chiffre pair le plus proche (également appelé « Arrondi du banquier »). Par exemple, les deux printf("%1.0f", 1.5)
et printf("%1.0f", 2.5)
doivent arrondir à 2. Auparavant, 1,5 arrondirait à 2 et 2,5 arrondirait à 3. Cette modification affecte uniquement les nombres représentant exactement. Par exemple, la version 2.35 (qui, lorsqu’elle est représentée en mémoire, est plus proche de 2,350000000000008) continue d’arrondir jusqu’à 2,4. L’arrondi effectué par ces fonctions respecte désormais également le mode d’arrondi à virgule flottante défini par fesetround
. Auparavant, l’arrondi a toujours choisi FE_TONEAREST
le comportement. Cette modification affecte uniquement les programmes générés à l’aide de Visual Studio 2019 version 16.2 et ultérieures. Pour utiliser le comportement d’arrondi à virgule flottante héritée, liez avec legacy_stdio_float_rounding.obj
.
Spécifications
Routine | En-tête requis |
---|---|
printf_s , _printf_s_l |
<stdio.h> |
wprintf_s , _wprintf_s_l |
<stdio.h> ou <wchar.h> |
La console n’est pas prise en charge dans les applications plateforme Windows universelle (UWP). Les handles de flux standard associés à la console, stdin
et stdout
stderr
doivent être redirigés avant que les fonctions d’exécution C puissent les utiliser dans les applications UWP. Pour plus d’informations sur la compatibilité, consultez Compatibility.
La console n’est pas prise en charge dans les applications plateforme Windows universelle (UWP). Les handles de flux standard associés à la console, stdin
et stdout
stderr
doivent être redirigés avant que les fonctions d’exécution C puissent les utiliser dans les applications UWP. Pour plus d’informations sur la compatibilité, consultez Compatibility.
Exemple
// crt_printf_s.c
/* This program uses the printf_s and wprintf_s functions
* to produce formatted output.
*/
#include <stdio.h>
int main( void )
{
char ch = 'h', *string = "computer";
int count = -9234;
double fp = 251.7366;
wchar_t wch = L'w', *wstring = L"Unicode";
/* Display integers. */
printf_s( "Integer formats:\n"
" Decimal: %d Justified: %.6d Unsigned: %u\n",
count, count, count );
printf_s( "Decimal %d as:\n Hex: %Xh C hex: 0x%x Octal: %o\n",
count, count, count, count );
/* Display in different radixes. */
printf_s( "Digits 10 equal:\n Hex: %i Octal: %i Decimal: %i\n",
0x10, 010, 10 );
/* Display characters. */
printf_s("Characters in field (1):\n%10c%5hc%5C%5lc\n", ch, ch, wch, wch);
wprintf_s(L"Characters in field (2):\n%10C%5hc%5c%5lc\n", ch, ch, wch, wch);
/* Display strings. */
printf_s("Strings in field (1):\n%25s\n%25.4hs\n %S%25.3ls\n",
string, string, wstring, wstring);
wprintf_s(L"Strings in field (2):\n%25S\n%25.4hs\n %s%25.3ls\n",
string, string, wstring, wstring);
/* Display real numbers. */
printf_s( "Real numbers:\n %f %.2f %e %E\n", fp, fp, fp, fp );
/* Display pointer. */
printf_s( "\nAddress as: %p\n", &count);
}
Exemple de sortie
Integer formats:
Decimal: -9234 Justified: -009234 Unsigned: 4294958062
Decimal -9234 as:
Hex: FFFFDBEEh C hex: 0xffffdbee Octal: 37777755756
Digits 10 equal:
Hex: 16 Octal: 8 Decimal: 10
Characters in field (1):
h h w w
Characters in field (2):
h h w w
Strings in field (1):
computer
comp
Unicode Uni
Strings in field (2):
computer
comp
Unicode Uni
Real numbers:
251.736600 251.74 2.517366e+002 2.517366E+002
Address as: 0012FF78
Voir aussi
Prise en charge mathématique et à virgule flottante
E/S de flux
Paramètres régionaux
fopen
, _wfopen
fprintf
, _fprintf_l
, fwprintf
, _fwprintf_l
scanf
, _scanf_l
, wscanf
, _wscanf_l
sprintf
, _sprintf_l
, swprintf
, _swprintf_l
, __swprintf_l
vprintf
, fonctions
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour