scanf_s
, , _scanf_s_l
wscanf_s
, ,_wscanf_s_l
Lit les données mises en forme du flux d'entrée standard. Ces versions de scanf
, , _scanf_l
, wscanf
, _wscanf_l
ont des améliorations de sécurité, comme décrit dans les fonctionnalités de sécurité dans le CRT.
Syntaxe
int scanf_s(
const char *format [,
argument]...
);
int _scanf_s_l(
const char *format,
_locale_t locale [,
argument]...
);
int wscanf_s(
const wchar_t *format [,
argument]...
);
int _wscanf_s_l(
const wchar_t *format,
_locale_t locale [,
argument]...
);
Paramètres
format
Format de la chaîne de contrôle.
argument
Arguments facultatifs.
locale
Paramètres régionaux à utiliser.
Valeur retournée
Retourne le nombre de champs correctement convertis et affectés. La valeur de retour n’inclut pas les champs qui ont été lus mais qui n’ont pas été affectés. Une valeur de retour de 0 indique qu’aucun champ n’a été affecté. La valeur de retour est EOF
pour une erreur, ou si le caractère de fin de fichier ou de fin de chaîne est trouvé dans la première tentative de lecture d’un caractère. S’il format
s’agit d’un NULL
pointeur, le gestionnaire de paramètres non valide est appelé, comme décrit dans la validation des paramètres. Si l'exécution est autorisée à continuer, scanf_s
et wscanf_s
retournent EOF
et définissent errno
à EINVAL
.
Pour plus d’informations sur ces codes d’erreur et d’autres codes d’erreur, consultez , , _sys_errlist
_doserrno
et _sys_nerr
.errno
Notes
La scanf_s
fonction lit les données du flux d’entrée standard et stdin
les écrit dans argument
. Chacun argument
doit être un pointeur vers un type de variable qui correspond au spécificateur de type dans format
. Si une copie se produit entre des chaînes qui se chevauchent, le comportement est indéfini.
wscanf_s
est une version à caractères larges de scanf_s
; l'argument format
de wscanf_s
est une chaîne à caractères larges. wscanf_s
et scanf_s
se comportent de la même façon si le flux est ouvert en mode ANSI. scanf_s
ne prend pas en charge actuellement les entrées à partir d'un flux UNICODE.
Les versions de ces fonctions qui ont le _l
suffixe sont identiques, sauf qu’elles utilisent le locale
paramètre au lieu des paramètres régionaux du thread actuel.
Contrairement scanf
à et wscanf
, scanf_s
et wscanf_s
vous devez spécifier des tailles de mémoire tampon pour certains paramètres. Spécifiez les tailles pour tous les paramètres de jeu de contrôles de chaîne, ou ,c
C
s
S
[]
La taille de la mémoire tampon en caractères est passée en tant que autre paramètre. Il suit immédiatement le pointeur vers la mémoire tampon ou la variable. Par exemple, si vous lisez une chaîne, la taille de la mémoire tampon de cette chaîne est passée comme suit :
char s[10];
scanf_s("%9s", s, (unsigned)_countof(s)); // buffer size is 10, width specification is 9
La taille de la mémoire tampon inclut la valeur null du terminal. Vous pouvez utiliser un champ de spécification de largeur pour vous assurer que le jeton lu s’inscrit dans la mémoire tampon. Lorsqu’un jeton est trop grand pour s’adapter, rien n’est écrit dans la mémoire tampon, sauf s’il existe une spécification de largeur.
Remarque
Le paramètre relatif à la taille est de type unsigned
, et non size_t
. Utilisez un cast statique pour convertir une valeur size_t
en unsigned
pour les configurations de build 64 bits.
Le paramètre de taille de mémoire tampon décrit le nombre maximal de caractères, et non pas les octets. Dans cet exemple, la largeur du type de mémoire tampon ne correspond pas à la largeur du spécificateur de format.
wchar_t ws[10];
wscanf_s(L"%9S", ws, (unsigned)_countof(ws));
Le spécificateur de S
format signifie utiliser la largeur de caractère « opposée » de la largeur par défaut prise en charge par la fonction. La largeur du caractère est un octet unique, mais la fonction prend en charge les caractères double octet. Cet exemple lit dans une chaîne allant jusqu’à neuf caractères à l’échelle d’un octet et les place dans une mémoire tampon de caractères à deux octets. Les caractères sont traités comme des valeurs codées sur un octet. Les deux premiers caractères sont stockés dans ws[0]
, alors que les deux derniers sont stockés dans ws[1]
, et ainsi de suite.
Cet exemple lit un caractère unique :
char c;
scanf_s("%c", &c, 1);
Lorsque plusieurs caractères pour les chaînes non terminées par null sont lus, les entiers sont utilisés pour la spécification de largeur et la taille de la mémoire tampon.
char c[4];
scanf_s("%4c", c, (unsigned)_countof(c)); // not null terminated
Pour plus d’informations, consultez scanf
Spécification de largeur.
Mappages de routines de texte générique
Routine TCHAR.H |
_UNICODE et _MBCS non définis |
_MBCS défini |
_UNICODE défini |
---|---|---|---|
_tscanf_s |
scanf_s |
scanf_s |
wscanf_s |
_tscanf_s_l |
_scanf_s_l |
_scanf_s_l |
_wscanf_s_l |
Pour plus d’informations, consultez Champs de spécification de format : scanf
et wscanf
fonctions.
Spécifications
Routine | En-tête requis |
---|---|
scanf_s , _scanf_s_l |
<stdio.h> |
wscanf_s , _wscanf_s_l |
<stdio.h> ou <wchar.h> |
La console n’est pas prise en charge dans les applications de la plateforme Windows universelle (UWP). Les handles stdin
de flux standard, stdout
et 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_scanf_s.c
// This program uses the scanf_s and wscanf_s functions
// to read formatted input.
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
int i,
result;
float fp;
char c,
s[80];
wchar_t wc,
ws[80];
result = scanf_s( "%d %f %c %C %s %S", &i, &fp, &c, 1,
&wc, 1, s, (unsigned)_countof(s), ws, (unsigned)_countof(ws) );
printf( "The number of fields input is %d\n", result );
printf( "The contents are: %d %f %c %C %s %S\n", i, fp, c,
wc, s, ws);
result = wscanf_s( L"%d %f %hc %lc %S %ls", &i, &fp, &c, 2,
&wc, 1, s, (unsigned)_countof(s), ws, (unsigned)_countof(ws) );
wprintf( L"The number of fields input is %d\n", result );
wprintf( L"The contents are: %d %f %C %c %hs %s\n", i, fp,
c, wc, s, ws);
}
Ce programme génère la sortie suivante en fonction de ce qui est entré :
71 98.6 h z Byte characters
36 92.3 y n Wide characters
The number of fields input is 6
The contents are: 71 98.599998 h z Byte characters
The number of fields input is 6
The contents are: 36 92.300003 y n Wide characters
Voir aussi
Prise en charge des fonctions mathématiques et à virgule flottante
E/S de flux
Paramètres régionaux
fscanf
, , _fscanf_l
fwscanf
, ,_fwscanf_l
printf
, , _printf_l
wprintf
, ,_wprintf_l
sprintf
, , _sprintf_l
swprintf
, , _swprintf_l
__swprintf_l
sscanf
, , _sscanf_l
swscanf
, ,_swscanf_l