getchar() != EOF

2 minutos de lectura

getchar EOF
Nishi

Estoy ejecutando el siguiente programa del libro Lenguaje de programación C:

#include <stdio.h>
main()
{
  int c;
  while((c=getchar()) != EOF)
    putchar(); 
}

O

#include<stdio.h>
int main(){
   int c = getchar();
   while(c != EOF){
      putchar(c);
      c = getchar();
   }
}

Cuando ejecuto este programa, obtengo un comportamiento inexplicable. Si ingreso caracteres desde la línea de comando en la siguiente secuencia: {'h', 'e', 'l', 'l', 'o', '\n', '^D'} luego obtengo la siguiente respuesta impresa en la pantalla: hellodespués \n se ingresa, y el programa se cierra una vez ^D en ingresado.

Sin embargo, cuando cambio la secuencia de la siguiente manera: {'h', 'e', 'l', 'l', 'o', '^D'} luego obtengo la siguiente respuesta impresa en la pantalla: hello, pero el programa no se cierra. ¿No debería dejar de funcionar una vez que entro? ^D? tengo que entrar ^D una segunda vez para que el programa se cierre. O el programa solo se cierra después de haber ingresado ^D siguiente \n. No entiendo por qué el programa no se cierra no importa cuando entro ^D. ¿Alguna idea?

Estoy ejecutando en un sistema UNIX.

Cuando escribe ^D (‘fin de transmisión’), el búfer de entrada se vacía y todo lo que escribió hasta ahora se envía a su programa (sin enviar realmente el carácter ^D). Es similar a escribir un carácter de nueva línea, sin embargo, en este caso también se envía el carácter de nueva línea. Un programa considera su entrada como cerrada cuando lee cero caracteres. Esto sucede cuando escribe una nueva línea seguida de ^D o dos ^D consecutivos.

  • tenga en cuenta que esta es una propiedad del flujo de entrada del sistema operativo, no del programa C.

    –MM

    28 de noviembre de 2014 a las 8:07

  • Gracias, Marian y Matt McNabb. Pensé que el búfer de entrada solo se vacía al escribir el carácter de nueva línea. No estaba al tanto de un comportamiento similar con ^D también.

    – Nishi

    3 de diciembre de 2014 a las 1:55

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad