Afficher
Le C abstrait pour nous toute la complexité qui consite à afficher concrètement du texte sur un écran.
Lorsqu’on lance un programme, un flux UNIX est ouvert
pour nous et il suffit d’écrire dessus des caractères
ASCII
pour que ceux-ci s’affichent sur une console. Ces opérations d’écriture et lecture sont
assurées par des
fonctions
dont la signature et
fournie par l’entête stdio.h
. L’éditeur de lien ajoute à notre
programme une librairie statique de type libc
qui contient
l’implémentation de ces fonctions.
Afficher un caractère sur un flux : fputc()
, putchar()
et putc()
La fonction fputc()
écrit le caractère spécifié en
premier argument sur le flux spécifié en deuxième
argument.
#include <stdio.h>
int main()
{
fputc('A', stdout);
fputc('B', 1);
fputc('B' + 1, stdout);
fputc(68, stdout);
/// Affiche "ABCD"
}
Lorsqu’on veut afficher des chaines de caractère on doit utiliser des guillemets doubles, et pour afficher des caractères isolés on doit utiliser des guillemets simples. Un caractère entouré de guillemets simples est considéré comme un nombre entier dont la valeur correspond au jeu de caractères du code source, typiquement un dérivé de l’ ASCII . En ASCII, ‘A’ vaut 65, ‘B’ vaut 66 et ‘C’ vaut 67 et ‘D’ vaut 68. Pour afficher un caractère on peut donc le passer de manière littérale entre guillemets simples, via sa valeur numérique ou toute expression qui évalue à une valeur entière.
Au démarrage du programme la machine virtuelle du
C ouvre pour nous trois flux, stdin
, stdout
et stderr
numérotés de 0 à 2. Le premier est ouvert
en lecture et sert à lire les entrées clavier.
Les deux suivant sont ouverts
en écriture et affichent du texte sur la console.
putchar()
fonctionne comme fputc()
à la différence
qu’elle écrit automatiquement sur stdout
.
#include <stdio.h>
int main()
{
putchar('A');
putchar('B');
/// Affiche "AB"
}
putc()
enfin est une
macro
qui fonctionne comme
fputc
. Etant une macro il est possible de
la redéfinir pour modifier la façon dont on veut que
notre programme traite le texte à afficher. On peut
par exemple définir qu’elle ne fasse rien si on veut
réduire “au silence” notre programme.
Afficher du texte: fputs()
, puts()
Ces fonctions acceptent des chaines de caractères ou des tableaux de caractères en paramètre.
#include <stdio.h>
int main()
{
fputs("Bonjour", stdout);
puts(" a tous");
/// Affiche "Bonjour a tous"
}
puts()
fonctionne comme fputs()
à la différence que
le flux de sortie est automatiquement stdout
et
qu’un
saut de ligne
est aujouté à la fin du texte.
Convertir des données non textuelles en texte : fprintf()
et printf()
Si on veut afficher un nombre comme 123
sur une console,
il faut convertir chaque chiffre en sa valeur ascii
correspondate. Ici en l’occurence il suffirait de faire
putchar(49); putchar(50); putchar(51);
, mais comment
trouver chacun de ces chiffres individuellement pour
n’importe quel nombre ?
On peut procéder par divisions successives par 10 et regarder le reste de la division jusaqu’a ce que le nombre devienne nul, puis afficher les chiffres dans l’ordre inverse ou on les a stockés. Cela se complexifie lorsqu’on doit traiter également des nombres négatifs ou a virgule.
printf()
effectue pour nous les conversions de tous les
types de base du C vers une forme affichable sur une console.
Elle prend en paramètre une chaine de caractères et un
nombre variable d’arguments supplémentaires,
et pour chaque caractère %
qu’elle trouve dans la chaine
de caractères initiale elle la remplacera par un des
arguments supplémentaires, dans l’ordre fourni. Chaque caractère %
doit être suivi au moins d’une lettre qui
spécifie le formattage souhaité pour l’affichage. Par
exemple %d
affiche le paramètre comme un nombre entier
décimal, %x
comme un nombre hexadécimal,
´%f´ comme un nombre à virgule flottante, etc.
Si on veut réelement afficher le caractère “%”, il faut
le doubler : %%
.
Il existe une vingtaine de spécificateurs différents
pour accomoder autant de types de base du langage.
#include <stdio.h>
int main()
{
fprintf(stdout, "Un caractère %c, un nombre %d, une autre chaine %s\n", 'A', 42, "coucou");
/// Affiche "Un caractère A, un nombre 42, une autre chaine coucou" et un saut de ligne
printf("%f\012", 23.5);
/// Affiche "23.50000" et un saut de ligne
}
Pour afficher un saut de ligne on utilise la
séquence
d’échappement
\n
plutot que mettre un saut de ligne
réel dans la chaine de caractères (ce qui est illégal en C).
On peut également mettre la valeur ascii du saut
de ligne sous sa forme octale \012
plutot que de \n
.
printf()
fonctionne comme fprintf()
avec stdout
comme
flux de sortie par defaut.