putchar(3)

Fonction de la bibliothèque C

Écrit un caractère sur la sortie standard, converti en unsigned char. Renvoie ce caractère ou EOF, et passe par le tampon de stdout comme printf.

Synopsis
#include <stdio.h>
int putchar(int c);

Description

putchar(c) écrit un seul caractère sur la sortie standard. C'est l'équivalent exact de putc(c, stdout), et la page de manuel est partagée avec fputc, putc, fputs et puts : man 3 putchar affiche puts(3).

Le paramètre est un int, mais seul un octet sort : c est converti en unsigned char juste avant l'écriture. putchar(321) écrit donc A, puisque 321 = 256 + 65.

Comme printf, putchar passe par le tampon de stdout. Le caractère n'est pas forcément à l'écran au retour de l'appel. Il part quand le tampon est vidé : à la fin d'une ligne si la sortie est un terminal, quand le tampon est plein, à la fin du programme ou sur un fflush(stdout).

Valeur de retour

Le caractère écrit, converti en unsigned char puis en int, donc une valeur de 0 à 255 sur les machines courantes. En cas d'erreur, EOF, et l'indicateur d'erreur de stdout est positionné. Un succès n'est jamais négatif, ce qui permet de tester putchar(c) == EOF.

Attention, c'est l'octet écrit qui revient, pas l'argument : putchar(321) renvoie 65.

Pièges

  • Alterner putchar (ou printf) et write(1, ...) sur la même sortie peut inverser l'ordre d'affichage : write écrit tout de suite, putchar attend le tampon. La page de manuel le déconseille explicitement. Voir l'exemple plus bas.

  • putchar('é') n'écrit pas un « é ». En UTF-8, é occupe deux octets ; GCC prévient (multi-character character constant) et un seul octet sort. Pour du texte accentué, utilise fputs("é", stdout).

  • putchar ne va pas à la ligne. Pour une chaîne suivie d'un retour à la ligne, c'est puts(3).

Exemple

retour.c
#include <stdio.h>
int main(void){    int a = putchar('A');    int b = putchar(321);
    putchar('\n');    printf("%d %d\n", a, b);    return 0;}
Terminal
$ gcc -Wall -Wextra retour.c -o retour$ ./retourAA65 65

Les deux appels écrivent A et renvoient 65 : de 321, seul l'octet de poids faible reste.

melange.c
#include <stdio.h>#include <unistd.h>
int main(void){    putchar('1');    write(1, "2", 1);    putchar('3');    putchar('\n');    return 0;}
Terminal
$ gcc -Wall -Wextra melange.c -o melange$ ./melange213

Le 1 attend dans le tampon de stdout pendant que write envoie le 2 directement au système ; le \n final vide ensuite 1 et 3 d'un coup. L'exercice Grademe putchar fait réécrire la fonction avec write, sans tampon : chaque appel écrit son octet immédiatement.

C

putchar

Écris gm_putchar avec write sur le descripteur 1 : il écrit un seul octet, sans tampon, et le renvoie sous forme d'int.

Ouvrir l'exercice

À toi d'écrire le code.