Partager via


scanf_s, , _scanf_s_lwscanf_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_doserrnoet _sys_nerr.errno

Notes

La scanf_s fonction lit les données du flux d’entrée standard et stdinles é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 ,cCsS[] 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 stdinde flux standard, stdoutet 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_lfwscanf, ,_fwscanf_l
printf, , _printf_lwprintf, ,_wprintf_l
sprintf, , _sprintf_lswprintf, , _swprintf_l__swprintf_l
sscanf, , _sscanf_lswscanf, ,_swscanf_l