scanf()
La fonction scanf est la fonction symétrique à printf; elle nous offre pratiquement les mêmes conversions que printf, mais en sens inverse.
Lecture formatée en langage algorithmique
lire <NomVariable1>,<NomVariable2>, ...
Lecture formatée en C
scanf("<format>",<AdrVar1>,<AdrVar2>, ...)
"<format>" |
: |
format de lecture des données |
|
<AdrVar1>,... |
: |
adresses des variables auxquelles les données seront attribuées |
* La fonction scanf reçoit ses données à partir du fichier d'entrée standard stdin (par défaut le clavier).
* La chaîne de format détermine comment les données reçues doivent être interprétées.
* Les données reçues correctement sont mémorisées successivement aux adresses indiquées par <AdrVar1>,... .
* L'adresse d'une variable est indiquée par le nom de la variable précédé du signe &.
Exemple
La suite d'instructions:
int JOUR, MOIS, ANNEE; scanf("%i %i %i", &JOUR, &MOIS, &ANNEE);lit trois entiers relatifs, séparés par des espaces, tabulations ou interlignes. Les valeurs sont attribuées respectivement aux trois variables JOUR, MOIS et ANNEE.
* scanf retourne comme résultat le nombre de données correctement reçues (type int).
Spécificateurs de format pour scanf
SYMBOLE |
LECTURE D'UN(E) |
TYPE |
%d ou %i |
entier relatif |
int* |
%u |
entier naturel (unsigned) |
int* |
%o |
entier exprimé en octal |
int* |
%b |
entier exprimé en hexadécimal |
int* |
%c |
caractère |
char* |
%s |
chaîne de caractères |
char* |
%f ou %e |
rationnel en notation décimale ou exponentielle (scientifique) |
float* |
Le symbole * indique que l'argument n'est pas une variable, mais l'adresse d'une variable de ce type (c.-à-d.: un pointeur sur une variable - voir chapitre 9 'Les pointeurs').
1. Le type long
Si nous voulons lire une donnée du type long, nous devons utiliser les spécificateurs %ld, %li, %lu, %lo, %lx. (Sinon, le nombre est simplement coupé à la taille de int).
2. Le type double
Si nous voulons lire une donnée du type double, nous devons utiliser les spécificateurs %le ou %lf.
3. Le type long double
Si nous voulons lire une donnée du type long double, nous devons utiliser les spécificateurs %Le ou %Lf.
4. Indication de la largeur maximale
Pour tous les spécificateurs, nous pouvons indiquer la largeur maximale du champ à évaluer pour une donnée. Les chiffres qui passent au-delà du champ défini sont attribués à la prochaine variable qui sera lue !
Exemple
Soient les instructions:
int A,B; scanf("%4d %2d", &A, &B);Si nous entrons le nombre 1234567, nous obtiendrons les affectations suivantes:
A=1234 B=56le chiffre 7 sera gardé pour la prochaine instruction de lecture.
5. Les signes d'espacement
Lors de l'entrée des données, une suite de signes d'espacement (espaces, tabulateurs, interlignes) est évaluée comme un seul espace. Dans la chaîne de format, les symboles \t, \n, \r ont le même effet qu'un simple espace.
Exemple
Pour la suite d'instructions
int JOUR, MOIS, ANNEE; scanf("%i %i %i", &JOUR, &MOIS, &ANNEE);les entrées suivantes sont correctes et équivalentes:
12 4 1980 ou 12 004 1980 ou 12 4 1980
6. Formats 'spéciaux'
Si la chaîne de format contient aussi d'autres caractères que des signes d'espacement, alors ces symboles doivent être introduits exactement dans l'ordre indiqué.
Exemple
La suite d'instructions
int JOUR, MOIS, ANNEE; scanf("%i/%i/%i", &JOUR, &MOIS, &ANNEE);
accepte les entrées: |
rejette les entrées: |
12/4/1980 |
12 4 1980 |
12/04/01980 |
12 /4 /1980 |
7. Nombre de valeurs lues
Lors de l'évaluation des données, scanf s'arrête si la chaîne de format a été travaillée jusqu'à la fin ou si une donnée ne correspond pas au format indiqué. scanf retourne comme résultat le nombre d'arguments correctement reçus et affectés.
Exemple
La suite d'instructions
int JOUR, MOIS, ANNEE, RECU; RECU = scanf("%i %i %i", &JOUR, &MOIS, &ANNEE);réagit de la façon suivante ( - valeur indéfinie):
Introduit: |
RECU |
JOUR |
MOIS |
ANNEE |
|
12 4 1980 |
==> |
3 |
12 |
4 |
1980 |
12/4/1980 |
==> |
1 |
12 |
- |
- |
12.4 1980 |
==> |
1 |
12 |
- |
- |
12 4 19.80 |
==> |
3 |
12 |
4 |
19 |