• Aucun résultat trouvé

1.7. Les entrées / sorties en C

1.7.4. La fonction scanf

printf("Ceci est une chaîne Unicode : ’%ls’\n", L"Hello World!");

return EXIT_SUCCESS;

}

Les valeurs disponibles pour le paramètre deindicateursont les caractères suivants : Tableau 1-5. Options d’alignements et de remplissange

Option Signification

0 justification à droite de la sortie, avec remplissage à gauche par des 0.

- justification à gauche de la sortie, avec remplissage à droite par des espaces.

+ affichage du signe pour les nombres positifs.

espace (’ ’) les nombres positifs commencent tous par un espace.

Le champlargeur permet de spécifier la largeur minimale du champ de sortie. Si la sortie est trop petite, on complète avec des 0 ou des espaces selon l’indicateur utilisé. Notez qu’il s’agit bien d’une largeur minimale ici et non d’une largeur maximale. Le résultat du formatage de la donnée à écrire peut donc dépasser la valeur indiquée pour la largeur du champ.

Enfin, le champprécisionspécifie la précision maximale de la sortie (nombre de chiffres à afficher pour les entiers, précision pour les flottants, et nombre de caractères pour les chaînes de caractères).

1.7.4. La fonction scanf

La fonctionscanfpermet de faire une ou plusieurs entrées. Comme la fonctionprintf, elle attend une chaîne de format en premier paramètre. Il faut ensuite passer les variables devant contenir les entrées dans les paramètres qui suivent. Sa syntaxe est la suivante :

scanf(chaîne de format, &variable [, &variable [...]]);

Chapitre 1. Première approche du C/C++

Elle renvoie le nombre de variables lues.

Ne cherchez pas à comprendre pour l’instant la signification du symbole&se trouvant devant chacune des variables. Sachez seulement que s’il est oublié, le programme plantera.

La chaîne de format peut contenir une chaînes de caractères et non uniquement des formateurs. Toute-fois, si elle contient autre chose que des formateurs, le texte saisi par l’utilisateur devra impérativement correspondre avec la chaîne de caractères de la chaîne de format.scanfcherchera à reconnaître cette chaîne, et arrêtera l’analyse à la première erreur.

La syntaxe des formateurs pourscanfdiffère un peu de celle de ceux deprintf:

%[*][largeur][taille]type

Les types utilisés pour les chaînes de format descanfsont semblables à ceux utilisés pourprintf. Toutefois, on prendra garde au fait que le type ’f’ correspond cette fois bel et bien au type de données float et non au type de données double. L’analyse d’un double se fera donc en ajoutant le modificateur de taille ’l’.

Le paramètrelargeurpermet quant à lui de spécifier le nombre maximal de caractères à prendre en compte lors de l’analyse du paramètre. Le paramètre ’*’ est facultatif, il indique seulement de passer la donnée entrée et de ne pas la stocker dans la variable destination. Attention, cette variable doit quand même être présente dans la liste des paramètres descanf.

Exemple 1-23. Calcul de moyenne

#include <stdlib.h>

#include <stdio.h>

int main(void) {

double x, y;

printf("Calcul de moyenne\n"); /* Affiche le titre. */

printf("Entrez le premier nombre : ");

scanf("%lf", &x); /* Entre le premier nombre. */

printf("\nEntrez le deuxième nombre : ");

scanf("%lf", &y); /* Entre le deuxième nombre. */

printf("\nLa valeur moyenne de %f et de %f est %f.\n", x, y, (x+y)/2);

return EXIT_SUCCESS;

}

Note :Vous noterez qu’il y a incohérence entre la chaîne de format utilisée pour lesscanfet la chaîne de format pour leprintf. Nul n’est parfait...

En pratique, la fonctionscanfn’analyse les caractères provenant du flux d’entrée que lorsqu’une ligne complète a été saisie. Toutefois, elle ne supprime pas du tampon de flux d’entrée le carac-tère de saut de ligne, si bien qu’il s’y trouvera toujours lors de l’entrée suivante. Cela n’est pas gênant si l’on n’utilise que la fonctionscanfpour réaliser les entrées de données dans le pro-gramme, car cette fonction ignore tout simplement ces caractères de saut de ligne. En revanche, si l’on utilise une autre fonction après un appel àscanf, il faut s’attendre à trouver ce caractère de saut de ligne dans le flux d’entrée.

La fonctionscanfn’est pas très adaptée à la lecture des chaînes de caractères, car il n’est pas facile de contrôler la taille maximale que l’utilisateur peut saisir. C’est pour cette raison que l’on a généralement recours à la fonctionfgets, qui permet de lire une ligne sur le flux d’entrée standard et de stocker le résultat dans une chaîne de caractères fournie en premier paramètre et dont la

Chapitre 1. Première approche du C/C++

longueur maximale est spécifiée en deuxième paramètre (nous verrons plus loin comment créer de telles chaînes de caractères). Le troisième paramètre de la fonctionfgetsest le flux à partir duquel la lecture de la ligne doit être réalisée, c’est à dire généralementstdin. L’analyse de la chaîne de caractères ainsi lue peut alors être faite avec une fonction similaire à la fonctionscanf, mais qui lit les caractères à analyser dans une chaîne de caractères au lieu de les lire directement depuis le flux d’entrée standard : la fonctionsscanf. Cette fonction s’utilise exactement comme la fonctionscanf, à ceci près qu’il faut lui fournir en premier paramètre la chaîne de caractères dans laquelle se trouvent les données à interpréter. La description de ces deux fonctions dépasse le cadre de ce document et ne sera donc pas faite ici. Veuillez vous référer à la documentation de votre environnement de développement ou à la bibliographie pour plus de détails à leur sujet.

Chapitre 1. Première approche du C/C++

Chapitre 2. Les structures de contrôle

Nous allons aborder dans ce chapitre un autre aspect du langage indispensable à la programmation, à savoir : lesstructures de contrôle. Ces structures permettent, comme leur nom l’indique, de contrôler l’exécution du programme en fonction de critères particuliers. Le C et le C++ disposent de toutes les structures de contrôle classiques des langages de programmation comme les tests, les boucles, les sauts, etc. Toutes ces structures sont décrites dans les sections suivantes.