2017-01-22 1 views
1

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?

+2

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". –

+0

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 –

+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. –

Répondre

0

Je pense que Ctl-D est juste pour déclencher le programme pour lire l'entrée. Parce que vous avez tapé quelques caractères, le programme a quelque chose à lire et ne voit pas la fin de l'entrée. Tapez Ctl-D seul, le programme essaie de lire l'entrée mais n'y voit rien et le prend comme ayant atteint la fin de l'entrée. Comme pour ajouter que Ctl-D lui-même n'est pas passé à getchar() pour être lu en entrée.