2011-09-10 8 views
7

Código:EOF en el símbolo del sistema de Windows no termina flujo de entrada

#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; 
} 

Pregunta:

  1. Todo funciona muy bien, ignorará espacios y salto de línea y la salida de la número de caracteres ingresados ​​en la pantalla (en este programa, simplemente trato la coma, el signo de exclamación, los números o cualquier carácter de símbolo especial imprimible como el signo y el carácter) cuando toco la simulación EOF que es ^z.

  2. Pero hay algo mal cuando ingreso esta línea al programa. Por ejemplo, ingresé esto: abcdefg^z, lo que significa que ingresé algún carácter antes y en la misma línea que ^z. En lugar de terminar el programa e imprimir el total de caracteres, el programa continuaría solicitando su opinión.

  3. La entrada de caracteres de terminación EOF solo funciona cuando especifico ^z en una sola línea o al hacer esto: ^zabvcjdjsjsj. ¿Por qué está pasando esto?

Respuesta

14

Esto es cierto en casi todos los controladores de terminal. Obtendrás el mismo comportamiento usando Linux.

Su programa no está ejecutando realmente el ciclo hasta que \n o ^z haya sido ingresado al final de una línea. El controlador del terminal está almacenando en búfer la entrada y no se ha enviado a su proceso hasta que eso ocurra.

Al final de una línea, golpeando ^z (o ^d en Linux) hace no causa el conductor del terminal para enviar EOF. Solo hace que descargue el búfer a su proceso (sin \n).

Golpeando ^z (o ^d en Linux) al comienzo de una línea es interpretado por el terminal como "Quiero señalizar EOF".

Puede observar este comportamiento si agrega el siguiente dentro de su bucle:

printf("%d\n",ch); 

Ejecutar el programa:

$ ./test 
abc      <- type "abc" and hit "enter" 
97 
98 
99 
10 
abc97     <- type "abc" and hit "^z" 
98 
99 

Para entender mejor esto, hay que darse cuenta de que EOF no es una personaje. ^z es un comando de usuario para el terminal en sí. Debido a que la terminal es responsable de tomar las aportaciones del usuario y pasarlas a los procesos, esto se vuelve complicado y, por lo tanto, la confusión.

Una forma de ver esto es presionando ^v y luego presionando ^z como entrada para su programa.

^v es otro comando de terminal que le dice al terminal: "Oye, lo siguiente que escribo es no interpretarlo como un comando de terminal; pasarlo al proceso 'en su lugar".

4

^Z solamente se traduce por la consola a una señal de EOF al programa cuando se escribe al comienzo de una línea. Así es como funciona la consola de Windows. No hay una "solución alternativa" a este comportamiento que yo sepa.

+0

Entonces, ¿por qué^z no se cuenta como un personaje cuando lo coloco después de una secuencia de caracteres en una línea? Por ejemplo, "abcdefg^z" solo me devuelve "Hay 7 caracteres en el lugar" en lugar de 8 después de ingresar^z después de esa línea. – caramel1995

+0

@ caramel23: Creo que la consola de Windows simplemente lo ignora y no le pasa un carácter al programa que se está ejecutando. No sé por qué sucede esto. –

Cuestiones relacionadas