sscanf_s
, , _sscanf_s_l
swscanf_s
, ,_swscanf_s_l
Lit les données mises en forme d’une chaîne. Ces versions de sscanf
, , _sscanf_l
, swscanf
, _swscanf_l
ont des améliorations de sécurité, comme décrit dans les fonctionnalités de sécurité dans le CRT.
Syntaxe
int sscanf_s(
const char *buffer,
const char *format [,
argument ] ...
);
int _sscanf_s_l(
const char *buffer,
const char *format,
_locale_t locale [,
argument ] ...
);
int swscanf_s(
const wchar_t *buffer,
const wchar_t *format [,
argument ] ...
);
int _swscanf_s_l(
const wchar_t *buffer,
const wchar_t *format,
_locale_t locale [,
argument ] ...
);
Paramètres
buffer
Données stockées
format
Chaîne de contrôle de format. Pour plus d’informations, consultez Champs de spécification de format : scanf
et wscanf
fonctions.
argument
Arguments facultatifs
locale
Paramètres régionaux à utiliser
Valeur retournée
Chacune de ces fonctions retourne le nombre de champs qui sont 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
en cas d’erreur ou si la fin de la chaîne est atteinte avant la première conversion.
Si buffer
ou format
est 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 à se poursuivre, ces fonctions retournent -1 et attribuent à errno
la valeur 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 fonction sscanf_s
lit les données à partir de buffer
à l’emplacement indiqué par chaque argument
. Les arguments situés après la chaîne de format spécifient des pointeurs vers des variables dont le type correspond à un spécificateur de type dans format
. Contrairement à la version moins sécurisée sscanf
, un paramètre de taille de mémoire tampon est nécessaire quand vous utilisez les caractères de champ de type c
, C
, s
, S
, ou des ensembles de contrôle de chaîne mise entre crochets []
. La taille de la mémoire tampon en caractères doit être fournie en tant que paramètre supplémentaire immédiatement après chaque paramètre de mémoire tampon qui en a besoin. Par exemple, si vous lisez dans une chaîne, la taille de la mémoire tampon pour cette chaîne est passée comme suit :
wchar_t ws[10];
swscanf_s(in_str, L"%9s", ws, (unsigned)_countof(ws)); // buffer size is 10, width specification is 9
La taille de la mémoire tampon inclut le caractère Null de fin. Un champ de spécification de largeur peut être utilisé pour faire en sorte 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.
Un caractère unique peut être lu comme suit :
wchar_t wc;
swscanf_s(in_str, L"%c", &wc, 1);
Cet exemple lit un caractère unique dans la chaîne d’entrée et le stocke dans une mémoire tampon à caractères larges. Quand vous lisez plusieurs caractères pour des chaînes qui ne se terminent pas par un caractère Null, des entiers non signés sont utilisés pour spécifier la largeur et la taille de la mémoire tampon.
char c[4];
sscanf_s(input, "%4c", &c, (unsigned)_countof(c)); // not null terminated
Pour plus d’informations, consultez scanf_s
, , _wscanf_s_l
wscanf_s
_scanf_s_l
et scanf
tapez des caractères de champ.
Remarque
Le paramètre relatif à la taille est de type unsigned
, et non size_t
. Quand vous compilez pour des cibles 64 bits, utilisez un cast statique pour convertir les résultats de _countof
ou sizeof
à la taille correcte.
L’argument format
contrôle l’interprétation des champs d’entrée et a les mêmes forme et fonction que l’argument format
de la fonction scanf_s
. Si une copie se produit entre des chaînes qui se chevauchent, le comportement est indéfini.
swscanf_s
est une version à caractères larges de sscanf_s
; les arguments de swscanf_s
sont des chaînes à caractères larges. sscanf_s
ne gère pas les caractères hexadécimaux multioctets. swscanf_s
ne gère pas les caractères hexadécimaux hexadécimaux ou « zone de compatibilité » Unicode. Sinon, swscanf_s
et sscanf_s
se comportent de la même façon.
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 routines de texte générique
Routine TCHAR.H |
_UNICODE et _MBCS non définis |
_MBCS défini |
_UNICODE défini |
---|---|---|---|
_stscanf_s |
sscanf_s |
sscanf_s |
swscanf_s |
_stscanf_s_l |
_sscanf_s_l |
_sscanf_s_l |
_swscanf_s_l |
Spécifications
Routine | En-tête requis |
---|---|
sscanf_s , _sscanf_s_l |
<stdio.h> |
swscanf_s , _swscanf_s_l |
<stdio.h> ou <wchar.h> |
Pour plus d’informations sur la compatibilité, consultez Compatibility.
Exemple
// crt_sscanf_s.c
// This program uses sscanf_s to read data items
// from a string named tokenstring, then displays them.
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
char tokenstring[] = "15 12 14...";
char s[81];
char c;
int i;
float fp;
// Input various data from tokenstring:
// max 80 character string plus null terminator
sscanf_s( tokenstring, "%s", s, (unsigned)_countof(s) );
sscanf_s( tokenstring, "%c", &c, (unsigned)sizeof(char) );
sscanf_s( tokenstring, "%d", &i );
sscanf_s( tokenstring, "%f", &fp );
// Output the data read
printf_s( "String = %s\n", s );
printf_s( "Character = %c\n", c );
printf_s( "Integer: = %d\n", i );
printf_s( "Real: = %f\n", fp );
}
String = 15
Character = 1
Integer: = 15
Real: = 15.000000
Voir aussi
E/S de flux
fscanf
, , _fscanf_l
fwscanf
, ,_fwscanf_l
scanf
, , _scanf_l
wscanf
, ,_wscanf_l
sprintf
, , _sprintf_l
swprintf
, , _swprintf_l
__swprintf_l
snprintf
, , _snprintf
_snprintf_l
, , _snwprintf
_snwprintf_l
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