Namespaces
Variants

vscanf, vfscanf, vsscanf, vscanf_s, vfscanf_s, vsscanf_s

Depuis fr.cppreference.net
< c | io
 
 
Entrée/sortie de fichier
Types et objets
        
Fonctions
Accès aux fichiers
(C95)
Entrée/sortie non formatée
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

Entrée formatée
Entrée/sortie directe
Sortie formatée
Positionnement dans le fichier
Gestion des erreurs
Opérations sur les fichiers
 
Défini dans l'en-tête <stdio.h>
int vscanf( const char* restrict format, va_list vlist );
(1) (depuis C99)
int vfscanf( FILE* restrict stream, const char* restrict format,
             va_list vlist );
(2) (depuis C99)
int vsscanf( const char* restrict buffer, const char* restrict format,
             va_list vlist );
(3) (depuis C99)
int vscanf_s(const char* restrict format, va_list vlist);
(4) (depuis C11)
int vfscanf_s( FILE* restrict stream, const char* restrict format,
               va_list vlist);
(5) (depuis C11)
int vsscanf_s( const char* restrict buffer, const char* restrict format,
               va_list vlist);
(6) (depuis C11)

Lit des données provenant de diverses sources, les interprète selon format et stocke les résultats dans des emplacements définis par vlist.

1) Lit les données depuis stdin
2) Lit les données depuis le flux de fichier stream
3) Lit les données depuis la chaîne de caractères terminée par null buffer. Atteindre la fin de la chaîne équivaut à atteindre la condition de fin de fichier pour fscanf
4-6) Identique à (1-3), sauf que %c, %s, et %[ les spécificateurs de conversion attendent chacun deux arguments (le pointeur habituel et une valeur de type rsize_t indiquant la taille du tableau de réception, qui peut être 1 lors de la lecture avec %c dans un seul char) et sauf que les erreurs suivantes sont détectées à l'exécution et appellent la fonction actuellement installée gestionnaire de contrainte :
  • tout argument de type pointeur est un pointeur nul
  • format, stream, ou buffer est un pointeur nul
  • le nombre de caractères qui serait écrit par %c, %s, ou %[, plus le caractère nul de terminaison, dépasserait le deuxième argument (rsize_t) fourni pour chacun de ces spécificateurs de conversion
  • éventuellement, toute autre erreur détectable, comme un spécificateur de conversion inconnu
Comme pour toutes les fonctions à vérification de limites, vscanf_s, vfscanf_s, et vsscanf_s ne sont garanties disponibles que si __STDC_LIB_EXT1__ est défini par l'implémentation et si l'utilisateur définit __STDC_WANT_LIB_EXT1__ comme la constante entière 1 avant d'inclure <stdio.h>.

Paramètres

stream - flux de fichier d'entrée à lire
buffer - pointeur vers une chaîne de caractères terminée par null à lire
format - pointeur vers une chaîne de caractères terminée par null spécifiant comment lire l'entrée
vlist - liste d'arguments variable contenant les arguments de réception.


La chaîne format est composée de

  • caractères multi-octets non blancs sauf % : chaque tel caractère dans la chaîne de format consomme exactement un caractère identique du flux d'entrée, ou provoque l'échec de la fonction si le caractère suivant du flux n'est pas égal.
  • caractères blancs : tout caractère blanc unique dans la chaîne de format consomme tous les caractères blancs consécutifs disponibles de l'entrée (déterminé comme si en appelant isspace dans une boucle). Notez qu'il n'y a pas de différence entre "\n", " ", "\t\t", ou tout autre blanc dans la chaîne de format.
  • spécifications de conversion. Chaque spécification de conversion a le format suivant :
  • caractère d'introduction %.
  • (optionnel) caractère de suppression d'affectation *. Si cette option est présente, la fonction n'affecte pas le résultat de la conversion à un argument de réception.
  • (optionnel) nombre entier (supérieur à zéro) qui spécifie la largeur de champ maximale, c'est-à-dire le nombre maximum de caractères que la fonction est autorisée à consommer lors de la conversion spécifiée par la spécification de conversion courante. Notez que %s et %[ peuvent provoquer un débordement de tampon si la largeur n'est pas fournie.
  • (optionnel) modificateur de longueur qui spécifie la taille de l'argument de réception, c'est-à-dire le type de destination réel. Cela affecte la précision de la conversion et les règles de débordement. Le type de destination par défaut est différent pour chaque type de conversion (voir tableau ci-dessous).
  • spécificateur de format de conversion.

Les spécificateurs de format suivants sont disponibles :

Conversion
spécificateur
Explication Type
d'argument attendu
Modificateur de longueur→ hh h aucun l ll j z t L
Disponible depuis C99 seulement→ Oui Oui Oui Oui Oui
%
Correspond à % littéral.
N/A N/A N/A N/A N/A N/A N/A N/A N/A
c

Correspond à un caractère ou à une séquence de caractères.

  • Si un spécificateur de largeur est utilisé, correspond exactement à largeur caractères (l'argument doit être un pointeur vers un tableau avec un espace suffisant).
  • Contrairement à %s et %[, n'ajoute pas le caractère nul à la fin du tableau.
N/A N/A
char*
wchar_t*
N/A N/A N/A N/A N/A
s

Correspond à une séquence de caractères non blancs (une chaîne).

  • Si un spécificateur de largeur est utilisé, correspond jusqu'à largeur ou jusqu'au premier caractère blanc, selon ce qui apparaît en premier.
  • Stocke toujours un caractère nul en plus des caractères correspondants (donc le tableau d'arguments doit avoir de la place pour au moins largeur+1 caractères).
[set ]

Correspond à une séquence non vide de caractères de l'ensemble de caractères.

  • Si le premier caractère de l'ensemble est ^, alors tous les caractères ne faisant pas partie de l'ensemble sont mis en correspondance.
  • Si l'ensemble commence par ] ou ^] alors le caractère ] est également inclus dans l'ensemble.
  • La question de savoir si le caractère - en position non initiale dans l'ensemble de balayage peut indiquer une plage, comme dans [0-9], est définie par l'implémentation.
  • Si un spécificateur de largeur est utilisé, correspond uniquement jusqu'à largeur.
  • Stocke toujours un caractère nul en plus des caractères correspondants (donc le tableau d'arguments doit avoir de la place pour au moins largeur+1 caractères).
d

Correspond à un entier décimal.

  • Le format du nombre est le même que celui attendu par strtol avec la valeur 10 pour l'argument base.
signed char* ou unsigned char*
signed short* ou unsigned short*
signed int* ou unsigned int*
signed long* ou unsigned long*
signed long long* ou unsigned long long*
intmax_t* ou uintmax_t*
size_t*
ptrdiff_t*
N/A
b (C23)

Correspond à un entier binaire non signé.

  • Le format du nombre est le même que celui attendu par strtoul avec la valeur 2 pour l'argument base.
i

Correspond à un entier.

  • Le format du nombre est le même que celui attendu par strtol avec la valeur 0 pour l'argument base (la base est déterminée par les premiers caractères analysés).
u

Correspond à un entier décimal non signé.

  • Le format du nombre est le même que celui attendu par strtoul avec la valeur 10 pour l'argument base.
o

Correspond à un entier octal non signé.

  • Le format du nombre est le même que celui attendu par strtoul avec la valeur 8 pour l'argument base.
x
X

Correspond à un entier hexadécimal non signé.

  • Le format du nombre est le même que celui attendu par strtoul avec la valeur 16 pour l'argument base.
n

Renvoie le nombre de caractères lus jusqu'à présent.

  • Aucune entrée n'est consommée. N'incrémente pas le compteur d'affectation.
  • Si le spécificateur a un opérateur de suppression d'affectation défini, le comportement est indéfini.
a (C99)
A (C99)
e
E
f
F (C99)
g
G

Correspond à un nombre à virgule flottante.

  • Le format du nombre est le même que celui attendu par strtof.
N/A N/A
float*
double*
N/A N/A N/A N/A
long double*
p

Correspond à une séquence de caractères définie par l'implémentation définissant un pointeur.

  • printfLes fonctions de la famille %p doivent produire la même séquence en utilisant le spécificateur de format
. N/A
void**
N/A N/A N/A N/A N/A N/A
Notes

Pour chaque spécificateur de conversion autre que n, la plus longue séquence de caractères d'entrée qui ne dépasse aucune largeur de champ spécifiée et qui est soit exactement ce que le spécificateur de conversion attend, soit un préfixe d'une séquence qu'il attendrait, est ce qui est consommé du flux. Le premier caractère, s'il existe, après cette séquence consommée reste non lu. Si la séquence consommée a une longueur nulle ou si la séquence consommée ne peut pas être convertie comme spécifié ci-dessus, l'échec de correspondance se produit, sauf si la fin de fichier, une erreur de codage ou une erreur de lecture a empêché l'entrée du flux, auquel cas il s'agit d'un échec d'entrée.

Sauf pour le spécificateur %, l'élément d'entrée (ou, pour %n, le nombre de caractères d'entrée) est d'abord converti en un type approprié au spécificateur de conversion. Sauf si l'affectation a été supprimée avec *, le résultat de la conversion est écrit dans l'objet pointé par le prochain argument qui n'a pas encore été écrit. Si cet objet n'a pas un type approprié, ou si le résultat de la conversion ne peut pas être représenté dans l'objet, le comportement est indéfini.

Tous les spécificateurs de conversion autres que [, c, et n consomment et ignorent tous les caractères blancs de début (déterminé comme si en appelant isspace) avant de tenter d'analyser l'entrée. Ces caractères consommés ne comptent pas dans la largeur de champ maximale spécifiée.

Les spécificateurs de conversion lc, ls, et l[ effectuent la conversion multi-octet en caractère large comme si en appelant mbrtowc avec un objet mbstate_t initialisé à zéro avant que le premier caractère ne soit converti.

Les spécificateurs de conversion s et [ stockent toujours le terminateur nul en plus des caractères correspondants. La taille du tableau de destination doit être au moins un de plus que la largeur de champ spécifiée. L'utilisation de %s ou %[, sans spécifier la taille du tableau de destination, est aussi dangereuse que gets.

Les spécifications de conversion correctes pour les types d'entiers de largeur fixe (int8_t, etc.) sont définies dans l'en-tête <inttypes.h> (bien que SCNdMAX, SCNuMAX, etc. soient synonymes de %jd, %ju, etc.).

Il y a un point de séquence après l'action de chaque spécificateur de conversion ; cela permet de stocker plusieurs champs dans la même variable "puits".

Lors de l'analyse d'une valeur à virgule flottante incomplète qui se termine par l'exposant sans chiffres, comme l'analyse de "100er" avec le spécificateur de conversion %f, la séquence "100e" (le plus long préfixe d'un nombre à virgule flottante potentiellement valide) est consommée, entraînant une erreur de correspondance (la séquence consommée ne peut pas être convertie en nombre à virgule flottante), avec "r" restant. Certaines implémentations existantes ne suivent pas cette règle et reviennent en arrière pour ne consommer que "100", laissant "er", par exemple, glibc bug 1765.

Si une spécification de conversion n'est pas valide, le comportement est indéfini.

Valeur de retour

1-3) Nombre d'arguments de réception affectés avec succès, ou EOF si une erreur de lecture se produit avant que le premier argument de réception ne soit affecté.
4-6) Identique à (1-3), sauf que EOF est également renvoyé en cas de violation de contrainte d'exécution.

Notes

Toutes ces fonctions invoquent va_arg au moins une fois, la valeur de arg est indéterminée après le retour. Ces fonctions n'invoquent pas va_end, et cela doit être fait par l'appelant.

Exemple

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

bool checked_sscanf(int count, const char* buf, const char* fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    int rc = vsscanf(buf, fmt, ap);
    va_end(ap);
    return rc == count;
}

int main(void)
{
    int n, m;

    printf("Parsing '1 2'...");
    if (checked_sscanf(2, "1 2", "%d %d", &n, &m))
        puts("success");
    else
        puts("failure");

    printf("Parsing '1 a'...");
    if (checked_sscanf(2, "1 a", "%d %d", &n, &m))
        puts("success");
    else
        puts("failure");
}

Sortie :

Parsing '1 2'...success
Parsing '1 a'...failure

Références

  • Norme C23 (ISO/IEC 9899:2024) :
  • 7.21.6.9 La fonction vfscanf (p : TBD)
  • 7.21.6.11 La fonction vscanf (p : TBD)
  • 7.21.6.14 La fonction vsscanf (p : TBD)
  • K.3.5.3.9 La fonction vfscanf_s (p : TBD)
  • K.3.5.3.11 La fonction vscanf_s (p : TBD)
  • K.3.5.3.14 La fonction vsscanf_s (p : TBD)
  • Norme C17 (ISO/IEC 9899:2018) :
  • 7.21.6.9 La fonction vfscanf (p : TBD)
  • 7.21.6.11 La fonction vscanf (p : TBD)
  • 7.21.6.14 La fonction vsscanf (p : TBD)
  • K.3.5.3.9 La fonction vfscanf_s (p : TBD)
  • K.3.5.3.11 La fonction vscanf_s (p : TBD)
  • K.3.5.3.14 La fonction vsscanf_s (p : TBD)
  • Norme C11 (ISO/IEC 9899:2011) :
  • 7.21.6.9 La fonction vfscanf (p : 327)
  • 7.21.6.11 La fonction vscanf (p : 328)
  • 7.21.6.14 La fonction vsscanf (p : 330)
  • K.3.5.3.9 La fonction vfscanf_s (p : 597-598)
  • K.3.5.3.11 La fonction vscanf_s (p : 599)
  • K.3.5.3.14 La fonction vsscanf_s (p : 602)
  • Norme C99 (ISO/IEC 9899:1999) :
  • 7.19.6.9 La fonction vfscanf (p : 293)
  • 7.19.6.11 La fonction vscanf (p : 294)
  • 7.19.6.14 La fonction vsscanf (p : 295)

Voir aussi

lit l'entrée formatée depuis stdin, un flux de fichier ou un tampon
(fonction)
écrit la sortie formatée vers stdout, un flux de fichier ou un tampon
en utilisant une liste d'arguments variable
(fonction)
Documentation C++ pour vscanf, vfscanf, vsscanf