EOF dans une invite de commande Windows n'est pas arrêter de flux d'entrée
Code:
#include <stdio.h>
#define NEWLINE '\n'
#define SPACE ' '
int main(void)
{
int ch;
int count = 0;
while((ch = getchar()) != EOF)
{
if(ch != NEWLINE && ch != SPACE)
count++;
}
printf("There are %d characters input\n" , count);
return 0;
}
Question:
-
Tout fonctionne bien, il ignore les espaces et les retour à la ligne de sortie et le nombre de caractères d'entrée à l'écran (dans ce programme, je viens de traiter virgule, point d'exclamation, de chiffres ou de tout document imprimable symbole spécial caractère comme esperluette que le caractère trop) quand j'ai frappé à la EOF simulation qui est
^z
. -
Mais il ya quelque chose de mal quand je saisie cette ligne pour le programme. Par exemple, j'ai cette entrée:
abcdefg^z
, ce qui signifie que je saisie de certains caractères avant et sur la même ligne que^z
. Au lieu de terminer le programme et imprimer des caractères au total, le programme continuera à demander pour l'entrée. -
EOF caractère de terminaison d'entrée ne fonctionne que lorsque je précise
^z
sur une seule ligne ou en faisant ceci:^zabvcjdjsjsj
. Pourquoi est-ce arrivé?
OriginalL'auteur caramel1995 | 2011-09-10
Vous devez vous connecter pour publier un commentaire.
Cela est vrai dans presque tous les pilote de terminal. Vous aurez le même problème à l'aide de Linux.
Votre programme n'est pas réellement de l'exécution de la boucle jusqu'à ce que
\n
ou^z
a été saisi par vous, à la fin d'une ligne. Le pilote de terminal est mise en mémoire tampon de l'entrée et il n'a pas été envoyé à votre processus jusqu'à ce qui se produit.À la fin d'une ligne, frapper
^z
(ou^d
sur Linux) ne pas cause le pilote de terminal pour envoyer des expressions du FOLKLORE. Il ne fait que vider la mémoire tampon de votre processus (sans\n
).Frapper
^z
(ou^d
sur Linux) au début d'une ligne est interprété par le terminal en tant que "je veux signal expressions du FOLKLORE".Vous pouvez observer ce comportement si vous ajoutez ce qui suit à l'intérieur de votre boucle:
Exécuter votre programme:
Pour mieux comprendre cela, vous vous rendez compte que les expressions du FOLKLORE n'est pas un personnage.
^z
est une commande de l'utilisateur pour le terminal lui-même. Parce que le terminal est responsable de la prise de la saisie de l'utilisateur et de les transmettre à des processus, ce qui est difficile et donc la confusion.Un moyen de le voir c'est en frappant
^v
puis en appuyant sur^z
comme entrée de votre programme.^v
est un autre terminal de commande qui indique le terminal, "Hey, la prochaine chose que j'type - ne pas interpréter cela comme un terminal de commande; la passer au processus de "l'entrée de la place".OriginalL'auteur Brian Roach
^Z
est seulement traduit par la console pour un EOF signal pour le programme quand il est tapé au début d'une ligne. C'est juste la manière que la console Windows fonctionne. Il n'y a pas de "solution" à ce comportement, que je sache.Je crois que la console windows simplement l'ignore et ne passe pas d'un caractère pour le programme en cours d'exécution. Je ne sais pas pourquoi cela se produit.
OriginalL'auteur CB Bailey