30. Entrée formatée▲
Il est possible d'indiquer le format des données attendues à l'entrée. Le format indique aussi bien les données à lire que les caractères qui doivent être ignorés.
Les indicateurs de formatage en entrée du D sont similaires à ceux du langage C.
L'indicateur de formatage " %s", que nous avons déjà utilisé dans les chapitres précédents, lit une donnée selon le type de la variable. Par exemple, comme le type de la variable suivante est double, les caractères à l'entrée seront lus comme une valeur flottante :
double
nombre;
readf
(
" %s"
, &
nombre);
La chaîne de formatage peut contenir trois types d'information :
- le caractère espace : indique zéro, un ou plusieurs caractères blancs dans l'entrée et indique que tous ces caractères devraient être lus et ignorés ;
- indicateur de format : comme pour les indicateurs de format de sortie, les indicateurs de format d'entrée commencent par le caractère % et déterminent le format de la donnée à lire ;
- n'importe quel autre caractère : indique que ces caractères sont attendus dans l'entrée tels quels, et qu'ils doivent être lus et ignorés.
La chaîne de formatage permet de sélectionner des informations spécifiques dans l'entrée et d'ignorer les autres.
Penchons-nous sur un exemple qui utilise les trois types d'information dans la chaîne de formatage. Supposons que l'on s'attende à voir apparaître le numéro d'étudiant et la classe dans l'entrée dans le format suivant :
numero:123
classe:90
Supposons également que les étiquettes numero: et classe: doivent être ignorées. La chaîne de formatage suivante sélectionnera les valeurs du numéro et de la classe et ignorera les autres caractères :
Les caractères surlignés doivent apparaître tels quels dans l'entrée ; readf() les lit et les ignore.
Le caractère espace qui apparaît dans la chaîne de formatage fera que tous les caractères blancs qui apparaîtront exactement à cet endroit seront lus et ignorés.
Comme le caractère % a un sens spécial dans les chaînes de formatage, quand ce caractère lui-même doit être lu et ignoré, il doit être écrit deux fois : %%.
Dans le chapitre sur les chainesChaînes de caractères pour lire une ligne de données depuis l'entrée, nous avons utilisé chomp(readln()). On peut également faire ceci en plaçant un caractère \n à la fin de la chaîne de formatage :
import
std.stdio;
void
main
(
)
{
write
(
"Prénom : "
);
string prenom;
readf
(
" %s\n"
, &
prenom); // ← \n à la fin
write
(
"Nom : "
);
string nom;
readf
(
" %s\n"
, &
nom); // ← \n à la fin
write
(
"Âge : "
);
int
age;
readf
(
" %s"
, &
age);
writefln
(
"%s %s (%s)"
, prenom, nom, age);
}
Les caractères \n à la fin des chaînes de formatage quand on lit le nom et le prénom font que les caractères de nouvelle ligne sont lus depuis l'entrée et ignorés. Cependant, il peut toujours être nécessaire de supprimer les caractères blancs se trouvant éventuellement en fin de ligne avec chomp().
30-1. Caractères d'indicateur de format▲
- d : lit un entier dans le système décimal.
- o : lit un entier dans le système octal.
- x : lit un entier dans le système hexadécimal.
- f : lit un nombre en virgule flottante.
- s : lit selon le type de la variable.
- c : lit un caractère. Cet indicateur permet aussi de lire des caractères blancs (ceux-ci ne sont pas ignorés).
Par exemple, si l'entrée contient « 23 23 23 », les valeurs seront lues différemment selon l'indicateur de format utilisé :
int
nombre_d;
int
nombre_o;
int
nombre_x;
readf
(
" %d %o %x"
, &
nombre_d, &
nombre_o, &
nombre_x);
writeln
(
"Lu avec %d : "
, nombre_d);
writeln
(
"Lu avec %o : "
, nombre_o);
writeln
(
"Lu avec %x : "
, nombre_x);
Même si l'entrée contient trois ensembles identiques de caractères « 23 », les valeurs des variables sont différentes :
Lu avec %d
: 23
Lu avec %o
: 19
Lu avec %x
: 35
Très brièvement, 23 vaut 2 × 8 + 3 = 19 dans le système octal et 2 × 16 + 3 = 35 dans le système hexadécimal.
30-2. Exercice▲
Supposons que l'entrée contient la date dans le format année.mois.jour. Écrivez un programme qui affiche le numéro du mois. Par exemple, si l'entrée est 2009.09.30, la sortie doit être 9.