Partager via


vscanf_s, vwscanf_s

Lit les données mises en forme du flux d'entrée standard. Ces versions ont des améliorations de vscanfvwscanfsécurité, comme décrit dans les fonctionnalités de sécurité du CRT.

Syntaxe

int vscanf_s(
   const char *format,
   va_list arglist
);
int vwscanf_s(
   const wchar_t *format,
   va_list arglist
);

Paramètres

format
Format de la chaîne de contrôle.

arglist
Liste d’arguments de variable.

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. La valeur de retour 0 indique qu'aucun champ n'a été assigné. La valeur de retour est EOF si une erreur est détectée, ou si le caractère de fin de fichier ou le caractère de fin de chaîne est rencontré durant 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, vscanf_s et vwscanf_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 fonction vscanf_s lit les données du flux d’entrée standard stdin et les écrit aux emplacements indiqués par la liste d’arguments arglist. Chaque argument de la liste doit être un pointeur désignant une variable d’un type qui correspond à un spécificateur de type dans format. Si une copie se produit entre des chaînes qui se chevauchent, le comportement est indéfini.

vwscanf_s est une version à caractères larges de vscanf_s; l'argument format de vwscanf_s est une chaîne à caractères larges. vwscanf_s et vscanf_s se comportent de la même façon si le flux est ouvert en mode ANSI. vscanf_s ne prend pas en charge l’entrée d’un flux UNICODE.

Contrairement vscanf à et vwscanf, vscanf_s et vwscanf_s exiger que la taille de la mémoire tampon soit spécifiée pour tous les paramètres d’entrée de type c, C, s, S ou jeux de contrôles de chaîne inclus dans []. La taille de la mémoire tampon en caractères est passée en tant que autre paramètre immédiatement après le pointeur vers la mémoire tampon ou la variable. La taille de la mémoire tampon en caractères d’une wchar_t chaîne n’est pas la même que la taille en octets.

La taille de la mémoire tampon inclut le caractère Null de fin. Vous pouvez utiliser un champ de spécification de largeur pour être certain que le jeton lu tiendra dans la mémoire tampon. Si aucun champ de spécification de largeur n’est utilisé et que le jeton lu est trop grand pour s’adapter à la mémoire tampon, rien n’est écrit dans cette mémoire tampon.

Remarque

Le size paramètre est de type unsigned, et non size_t.

Pour plus d’informations, consultez Spécification de largeur scanf.

Mappages de routine de texte générique

Routine TCHAR.H _UNICODE et _MBCS non défini _MBCS Défini _UNICODE Défini
_vtscanf_s vscanf_s vscanf_s vwscanf_s

Pour plus d’informations, consultez Champs de spécification de format : scanf et wscanf fonctions.

Spécifications

Routine En-tête requis
vscanf_s <stdio.h>
wscanf_s <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, stdinet stdoutstderrdoivent ê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_vscanf_s.c
// compile with: /W3
// This program uses the vscanf_s and vwscanf_s functions
// to read formatted input.

#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>

int call_vscanf_s(char *format, ...)
{
    int result;
    va_list arglist;
    va_start(arglist, format);
    result = vscanf_s(format, arglist);
    va_end(arglist);
    return result;
}

int call_vwscanf_s(wchar_t *format, ...)
{
    int result;
    va_list arglist;
    va_start(arglist, format);
    result = vwscanf_s(format, arglist);
    va_end(arglist);
    return result;
}

int main( void )
{
    int   i, result;
    float fp;
    char  c, s[81];
    wchar_t wc, ws[81];
    result = call_vscanf_s("%d %f %c %C %s %S", &i, &fp, &c, 1,
                           &wc, 1, s, _countof(s), ws, _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 = call_vwscanf_s(L"%d %f %hc %lc %S %ls", &i, &fp, &c, 2,
                            &wc, 1, s, _countof(s), ws, _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);
}

Quand l’entrée de l’exemple est communiquée à ce programme, il génère cette sortie :

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 mathématique et à virgule flottante
E/S de flux
Paramètres régionaux
printf, _printf_l, wprintf, _wprintf_l
scanf, _scanf_l, wscanf, _wscanf_l
scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l
vscanf, vwscanf