Bit confondu avec le code actuel. Etudier à l'Uni et va actuellement par Le langage de programmation C (2e édition) par Brian W. KernighanTentative d'impression du retour d'un getchar()! = EOF de tous les caractères saisis
Maintenant, je suis programmation depuis un bon nombre d'années, principalement en C++ et un peu de java, mais pas vraiment joué avec C autant et quelque chose m'embête vraiment.
exercice donc 1-6 dans le livre que vous veut prouver que le charbon lu par getchar()
serait soit 1
ou 0
Maintenant, je comprends très bien qu'il lit le caractère dans la mémoire tampon et vérifie pour voir si elle est pas EOF
, s'il retourne 1
autre 0
Cela signifie que si je tape a
et appuyez sur Entrée, il lit le a
et entrer et retourne 1,1
aussi, si j'utilise CTRL+D
retourne 0
car il provoque un EOF
. Le problème que j'ai et où je ne comprends pas la logique est: quand je tape aa Ctrl+D
, la façon dont je l'ai lu, il devrait imprimer 1,1,0
comme il lit le a,a
puis EOF
, mais il semble imprimer 1,1
puis attendre la prochaine entrée.
Pourquoi est-ce?
Voici le code que j'ai écrit jusqu'à maintenant.
#include <stdio.h>
main()
{
int c;
while(c = (getchar() != EOF)) // Read char in buffer and check to see if it's EOF or not, then assign a 1 or 0 to c
{
printf("1 Not End Of File\n");
}
printf("0 End Of File\n");
}
Il est évident que je pourrais utiliser printf("%d",c);
pour montrer si son un 1
ou 0
, mais la question est toujours debout ..
Pourquoi quand je fais aa ctrl+D
impression ne sera pas
1 Not End Of File
1 Not End Of File
0 End Of File?
Aussi je Je suis pleinement conscient que cette même question a été répondue sur le site avant qu'il semble que personne n'a répondu à cette question en détail, ils semblent plutôt dire comment getchar()
obtient un char et re annonces il et comment le moment se termine quand c'est un EOF
, mais pas pourquoi la ligne suivante n'est pas courue si un EOF
est ajouté à quelques caractères.
Il semble lire les deux a
« s et ensuite plutôt que de mettre c
-0
quand il devrait atteindre le CTRL+D
puis quittez le moment, il semble asseoir et attendre plus d'entrée?
Il se peut que vous voyiez des problèmes concernant l'entrée du terminal, ce qui n'a rien à voir avec votre code C. Essayez de comparer ces trois expériences: (1) "a a RETURN CTRL + D", (2) "a a CTRL + D", (3) "a a CTRL + D CTRL + D". –
Vous voyez c'est ce que je pensais. J'avais testé les trois expériences, 1) renvoie 1,1,1 puis attend l'entrée et ctrl + d puis sort 0 ... 2) renvoie 1,1 puis attend la saisie.3) renvoie 1,1 attend la saisie puis 0 –
C'est le résultat attendu, et cela correspond à la réponse de Shiping. Le pilote de terminal Unix/Linux accumule les caractères et ne les transmet pas à votre programme tant que (a) vous n'avez pas appuyé sur Retour ou (b) que vous avez appuyé sur Contrôle-D. De même, si c'est au début d'une ligne (c'est-à-dire si elle est précédée d'un saut de ligne), control-D génère EOF. –