Introduction au langage C Les entrées-sorties 1ère année Génie Informatique Dr Daouda Traoré Université de Ségou email: daoudatr2008@gmail.com
Introduction Les entrées-sorties permettent d’afficher des informations à l’écran ou de les lire au clavier ou d’échanger des informations avec des fichiers. Nous nous limiterons aux entrées-sorties standards (affichage sur l’écran et lecture au clavier) Nous allons étudier les fonctions printf et scanf fournies par le langage C. Elles permettent d’afficher des informations à l’écran ou d’en lire au clavier.
La fonction printf Elle permet d’afficher des informations à l’écran. Sa syntaxe est la suivante: printf(chaine de caractères entre guillemet (" ") contenant éventuellement des codes de format , puis suivis éventuellement d’une virgule suivie d’une liste d’expressions séparées par des virgules d’un types en accord avec le code format correspondant) La chaine de caractères contient à la fois : Des caractères à afficher tels quels, Des « codes de format » repérés par %. Un « code de conversion » (tel que c, d ou f) y précise le type d’information à afficher. Un code de format peut contenir des informations complémentaires agissant sur le « cadrage », le « gabarit » ou la « précision ».
La fonction printf : les principaux codes de conversion c char : caractère affiché « en clair » (peut convenir aussi à short ou int compte tenu des conversions systématiques) d int (peut convenir aussi à short ou char compte tenu des conversions systématiques) u unsigned int (peut convenir aussi à unsigned short ou unsigned char compte tenu des conversions systématiques) ld long lu unisgned long f double ou float : écrit en notation « décimale » avec six chiffres après le point. e double : : écrit en notation « exponentielle (mantisse entre 1 inclus et 10 exclus) » avec six chiffres après le point décimal, sous la forme x.xxxxxxe+yyy ou x.xxxxxxe-yyy pour les nombres positifs et –x.xxxxxxe+yyy ou –x.xxxxxxe-yyy s chaîne de caractère dont fournit l’adresse
La fonction printf : action sur le gabarit d’affichage Par défaut, les entiers sont affichés avec le nombre de caractères nécessaires (sans espaces avant ou après). Les flottants sont affichés avec six chiffres après le point (aussi bien pour le code e que f). Un nombre placé après % dans le code de format précise un gabarit d’affichage, c’est-à-dire un nombre minimal de caractères à utiliser. Si le nombre peut s’écrire avec moins de caractères, printf le fera précéder d’un nombre suffisant d’espaces; en revanche, si le nombre ne peut s’afficher convenablement dans le gabarit imparti, printf utilisera le nombre de caractères nécessaires. Exemples : printf("%4d",n) => si n=15 ^^15 si n= 2 ^^^2 si n=1988 1988 si n=19787 19787 Le symbole ^ représente un espace
La fonction printf : action sur la précision On peut spécifier un nombre de chiffres (éventuellement inférieur à 6) après le point décimal (aussi bien pour la notation décimale que pour la notation exponentielle). Ce nombre doit apparaître, précédé d’un point, avant le code de format (et éventuellement après le gabarit) printf("%10.2f",n) => si n=5.2531 ^^^^^^5.25 si n= 5.2531E3 ^^^5253.10 si n= 5.2531E7 52531000.00 Le signe moins (-), placé immédiatement après le symbole % (comme dans %-5d ou %-8.2f), demande de « cadrer » l’affichage à gauche au lieu de le cadrer (par défaut) à droite; les éventuels espaces supplémentaires sont donc placés à droite et non plus à gauche de l’information affichée. Le caractère * figurant à la place d’un gabarit ou d’une précision signifie que la valeur effective est fournie dans la liste des arguments de printf. Exemple printf("%5.*f",n, x) => n=2, x=1.25478 ^1.25
La fonction scanf Elle permet de lire des informations saisies au clavier. Sa syntaxe est la suivante: scanf(chaine de caractères entre guillemet (" ") suivie d’une virgule suivie d’une liste d’adresses séparées par des virgules d’un type en accord avec le code format correspondant) La chaine de caractères contient à la fois : Eventuellement des séparateurs Des « codes de format » repérés par %. Un « code de conversion » (tel que c, d ou f) y précise le type d’information à saisir. Un code de format peut contenir des informations complémentaires agissant sur le « cadrage », le « gabarit » ou la « précision ».
La fonction scanf : les principaux codes de conversion c char d int u unsigned int hd short int hu unsigned short ld long int lu unisigned long f ou e float écrit indifféremment dans l’une des deux notations : décimale (éventuellement sans point, c’est-à-dire comme un entier) ou exponentielle (avec la lettre e ou E) lf ou le double écrit indifféremment dans l’une des deux notations : décimale (éventuellement sans point, c’est-à-dire comme un entier) ou exponentielle (avec la lettre e ou E) s chaîne de caractère dont fournit l’adresse Remarque : contrairement à ce qui se passait pour printf, il ne peut plus y avoir ici de conversion automatique puisque l’argument transmit à scanf est l’adresse d’un emplacement mémoire. C’est ce qui justifie l’existence d’un code hd par exemple pour le type short ou encore celle des codes lf et le pour le type double.
La fonction scanf : action sur le gabarit On peut préciser un gabarit dans un code de format scanf. Le traitement d’un code de format s’interrompt soit à la rencontre d’un séparateur (espace, fin de ligne, tabulations (horizontale et verticale), changement de page), soit lorsque le nombre de caractères indiqués a été atteint (les séparateurs éventuellement sautés auparavant ne sont pas comptabilisés) Exemples : Sans gabarit int a; scanf("%d" , &a); valeur 15 => a=15 int a, char c; scanf("%d%c" , &a, &c); valeurs saisie 1512a => a=1512 et c=‘a’ Avec gabarit scanf("%3d%3d",&n,&p) valeur saisie : 12 25 => n=12, p=25 valeur saisie : 12474 => n=124, p=74
La fonction scanf : espace dans le format Un espace entre deux codes de format demande à scanf d’ignorer la prise en compte des séparateurs dans l’analyse de la chaine saisie. C’est déjà le cas lorsque qu’elle analyse les types numériques. Exemples : scanf("%3d %c",&n,&c) valeur saisie : 12 a => n=12, c=a valeur saisie : 12 a b => n=12, c=a