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.
#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(ouprintf) etwrite(1, ...)sur la même sortie peut inverser l'ordre d'affichage :writeécrit tout de suite,putcharattend 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é, utilisefputs("é", stdout).putcharne va pas à la ligne. Pour une chaîne suivie d'un retour à la ligne, c'est puts(3).
Exemple
#include <stdio.h>
int main(void){ int a = putchar('A'); int b = putchar(321);
putchar('\n'); printf("%d %d\n", a, b); return 0;}$ gcc -Wall -Wextra retour.c -o retour$ ./retourAA65 65Les deux appels écrivent A et renvoient 65 : de 321, seul l'octet de poids faible reste.
#include <stdio.h>#include <unistd.h>
int main(void){ putchar('1'); write(1, "2", 1); putchar('3'); putchar('\n'); return 0;}$ gcc -Wall -Wextra melange.c -o melange$ ./melange213Le 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.
putchar
Écris gm_putchar avec write sur le descripteur 1 : il écrit un seul octet, sans tampon, et le renvoie sous forme d'int.