std::scanf, std::fscanf, std::sscanf
| Défini dans l'en-tête <cstdio>
|
||
int scanf( const char* format, ... );
|
(1) | |
int fscanf( std::FILE* stream, const char* format, ... );
|
(2) | |
int sscanf( const char* buffer, const char* format, ... );
|
(3) | |
Lit des données à partir de diverses sources, les interprète selon format et stocke les résultats dans des emplacements donnés.
stream.buffer.Paramètres
| stream | - | flux de fichier d'entrée depuis lequel lire |
| buffer | - | pointeur vers une chaîne de caractères terminée par un caractère nul depuis laquelle lire |
| format | - | pointeur vers une chaîne de caractères terminée par un caractère nul spécifiant comment lire l'entrée |
| ... | - | arguments de réception |
La chaîne de caractères format se compose 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 sur le 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 par appel à std::isspace dans une boucle). Notez qu'il n'y a pas de différence entre
"\n"," ","\t\t"ou d'autres caractères blancs dans la chaîne de format. - spécifications de conversion. Chaque spécification de conversion a le format suivant :
- caractère d'introduction
%.
- 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) caractère de suppression d'affectation
- (optionnel) nombre entier (supérieur à zéro) qui spécifie la largeur de champ maximale, c'est-à-dire le nombre maximal 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
%set%[peuvent entraîner un débordement de tampon si la largeur n'est pas fournie.
- (optionnel) nombre entier (supérieur à zéro) qui spécifie la largeur de champ maximale, c'est-à-dire le nombre maximal 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
- (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 :
| Spécificateur de conversion |
Explication | Type d'argument attendu | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Modificateur de longueur → | hh
|
h
|
aucun | l
|
ll
|
j
|
z
|
t
|
L
| |
| Disponible seulement depuis C++11 → | Oui | Oui | Oui | Oui | Oui | |||||
%
|
Correspond au 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.
|
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).
| |||||||||
[ensemble ]
|
Correspond à une séquence non vide de caractères de l'ensemble de caractères.
| |||||||||
d
|
Correspond à un entier décimal.
|
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* |
std::intmax_t* ou std::uintmax_t* |
std::size_t* |
std::ptrdiff_t* |
N/A |
b (C++26)
|
Correspond à un entier binaire non signé.
| |||||||||
i
|
Correspond à un entier.
| |||||||||
u
|
Correspond à un entier décimal non signé.
| |||||||||
o
|
Correspond à un entier octal non signé.
| |||||||||
xX
|
Correspond à un entier hexadécimal non signé.
| |||||||||
n
|
Retourne le nombre de caractères lus jusqu'à présent.
| |||||||||
a (C++11)A (C++11)eEfF (C++11)gG
|
Correspond à un nombre à virgule flottante.
|
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.
|
N/A | N/A | void** |
N/A | N/A | N/A | N/A | N/A | N/A |
| Notes | ||||||||||
|
Pour chaque spécificateur de conversion autre que Sauf pour le spécificateur Tous les spécificateurs de conversion autres que Les spécificateurs de conversion Les spécificateurs de conversion Les spécifications de conversion correctes pour les types d'entiers de largeur fixe (std::int8_t, etc.) sont définies dans l'en-tête <cinttypes> (bien que SCNdMAX, SCNuMAX, etc. soient synonymes de 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 Si une spécification de conversion est invalide, le comportement est indéfini. | ||||||||||
Valeur de retour
Nombre d'arguments de réception affectés avec succès (qui peut être nul en cas d'échec de correspondance avant l'affectation du premier argument de réception), ou EOF si un échec d'entrée se produit avant l'affectation du premier argument de réception.
Complexité
Non garantie. Notamment, certaines implémentations de std::sscanf sont O(N), où N = std::strlen(buffer) [1]. Pour une analyse performante de chaînes, voir std::from_chars.
Notes
Étant donné que la plupart des spécificateurs de conversion consomment d'abord tous les caractères blancs consécutifs, un code tel que
std::scanf("%d", &a);
std::scanf("%d", &b);
lira deux entiers qui sont saisis sur des lignes différentes (le deuxième %d consommera le saut de ligne laissé par le premier) ou sur la même ligne, séparés par des espaces ou des tabulations (le deuxième %d consommera les espaces ou les tabulations).
Les spécificateurs de conversion qui ne consomment pas les caractères blancs de tête, tels que %c, peuvent être amenés à le faire en utilisant un caractère blanc dans la chaîne de format :
std::scanf("%d", &a);
std::scanf(" %c", &c); // ignore the endline after %d, then read a char
Notez que certaines implémentations de std::sscanf impliquent un appel à std::strlen, ce qui rend leur temps d'exécution linéaire en fonction de la longueur de la chaîne entière. Cela signifie que si std::sscanf est appelé dans une boucle pour analyser de manière répétée des valeurs depuis le début d'une chaîne, votre code pourrait s'exécuter en temps quadratique (exemple).
Exemple
#include <clocale>
#include <cstdio>
#include <iostream>
int main()
{
int i, j;
float x, y;
char str1[10], str2[4];
wchar_t warr[2];
std::setlocale(LC_ALL, "en_US.utf8");
char input[] = "25 54.32E-1 Thompson 56789 0123 56ß水";
// parse as follows:
// %d: an integer
// %f: a floating-point value
// %9s: a string of at most 9 non-whitespace characters
// %2d: two-digit integer (digits 5 and 6)
// %f: a floating-point value (digits 7, 8, 9)
// %*d an integer which isn't stored anywhere
// ' ': all consecutive whitespace
// %3[0-9]: a string of at most 3 digits (digits 5 and 6)
// %2lc: two wide characters, using multibyte to wide conversion
const int ret = std::sscanf(input, "%d%f%9s%2d%f%*d %3[0-9]%2lc",
&i, &x, str1, &j, &y, str2, warr);
std::cout << "Converted " << ret << " fields:\n"
"i = " << i << "\n"
"x = " << x << "\n"
"str1 = " << str1 << "\n"
"j = " << j << "\n"
"y = " << y << "\n"
"str2 = " << str2 << std::hex << "\n"
"warr[0] = U+" << (int)warr[0] << "\n"
"warr[1] = U+" << (int)warr[1] << '\n';
}
Sortie :
Converted 7 fields:
i = 25
x = 5.432
str1 = Thompson
j = 56
y = 789
str2 = 56
warr[0] = U+df
warr[1] = U+6c34
Voir aussi
(C++11)(C++11)(C++11) |
lit l'entrée formatée depuis stdin, un flux de fichier ou un tampon en utilisant une liste d'arguments variables (fonction) |
| obtient une chaîne de caractères depuis un flux de fichier (fonction) | |
(C++11) |
imprime une sortie formatée vers stdout, un flux de fichier ou un tampon (fonction) |
(C++17) |
convertit une séquence de caractères en une valeur entière ou à virgule flottante (fonction) |
Documentation C pour scanf, fscanf, sscanf
| |