[K&R] Copie entrée sur sortie
Salut,
dans le Kernighan & Ritchie, il y a le code suivant :
Code:
1 2 3 4 5 6 7 8 9 10
|
#include <stdio.h>
main()
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
} |
Ce code redirige donc l'entrée au clavier sur l'ecran. J'ai donc recopié ce code et compilé pour tester. Si je tape :
au clavier : ça m'écrit bien à l'ecran mais dès que je fais Entrée, il me reécrit "salut" une deuxième fois à la ligne :?
J'ai fais quelque chose de mal ? 8O
Ce phénomène m'embête un peu car je ne peux pas faire les exos plus interessants... :?
Je precise que je compile avec Visual (projet console .c )
Merci pour vos réponses
Re: [K&R] Copie entrée sur sortie
Citation:
Envoyé par sorry60
dans le Kernighan & Ritchie, il y a le code suivant :
Code:
1 2 3 4 5 6 7 8 9 10
|
#include <stdio.h>
main()
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
} |
Ce code redirige donc l'entrée au clavier sur l'ecran. J'ai donc recopié ce code et compilé pour tester. Si je tape :
au clavier : ça m'écrit bien
à l'ecran mais dès que je fais Entrée, il me reécrit "salut" une deuxième fois à la ligne :?
C'est normal. Il est important de bien comprendre le fonctionnement de getchar() qui est plus complexe qu'il n'y parait, et pratiquement jamais expliqué par aucun prof ou bouquin...
(On admettra que stdin et stdout sont connectés la console)
Lorsque le programme appelle getchar(), l'exécution se suspend, et c'est le système qui prend la main. Lorsque on tapes sur le clavier, le système renvoie le caractètre tapé à l'écran en temps réel (echo). On peux même éditer (corriger) avec la touche <backspace>. Les caractètres tapés sont stockés dans un buffer système.
Au moment où l'on tapes <enter>, le système 'rend la main' au programme, getchar() retourne le plus ancien caractère stocké et, celui ci est alors affiché par putchar().
Ensuite, getchar() est à nouveau appelé, mais comme le buffer de saisie (stdin) n'est pas vide, il va extraire directement le plus ancien caractère non lu et l'afficher, et ce jusqu'à ce que le buffer de saisie soit vide. A ce moment, le programme repasse la main au système qui attend de nouvelles frappes suivies de <enter> ou une commande de fin de lecture simulée par Ctrl-D sous unixoide ou Ctrl-Z sous MS-DOS / Windows...