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.