Previous Next Up Index Contents

4.2. Lecture formatée de données


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>,... .

Attention!

* 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

Attention!

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=56
le 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


Exercice 4.2

En vous référant aux exemples du chapitre 4.2, écrivez un programme qui lit la date du clavier et écrit les données ainsi que le nombre de données correctement reçues sur l'écran.

Exemple:

   Introduisez la date (jour mois année): 11 11 1991
   
   données reçues : 3
   jour  : 11
   mois  : 11
   année : 1991

* Testez les réactions du programme à vos entrées. Essayez d'introduire des nombres de différents formats et différentes grandeurs.

* Changez la partie format du programme de façon à séparer les différentes données par le symbole '-' .


Previous Next Up Index Contents

Feedback - Copyright © 1993,1996,1997 F.Faber