¿Por qué getchar () no reconoce return como EOF en la consola?

Tengo un pequeño fragmento de código a continuación que estoy usando con PellesC .

Cuando se ejecuta el código y he escrito algunos caracteres en la consola, presiono enter.

¿Puede explicarme por qué printf("%ld\n", nc); línea no parece ser ejecutada? Como no se escribe ningún resultado en la consola.

 #include  int main(void) { long nc = 0; while(getchar() != EOF) { ++nc; } printf("%ld\n", nc); } 

He decidido aprender C a fondo usando el libro de K & R y me da vergüenza decir que este ejemplo bastante elemental me ha dejado perplejo.

Presionar enter no causa un EOF (“fin del archivo”). Debe indicar que ha terminado de proporcionar información; en Unix normalmente haces eso presionando Ctrl D. En Windows creo que es Ctrl Z seguido de enter, pero realmente no estoy seguro de eso.

Solo obtendrá un EOF de la transmisión cuando se llegue al final del archivo, no al final de la línea. La forma en que señala un final de archivo depende de su sistema operativo y la configuración del terminal.

Por lo general, es CTRL d en sistemas de tipo UNIX y CTRL z en Windows. Para UNIX en modo cocido (modo de entrada normal), generalmente tendrá que ingresarlo como el primer carácter de una línea y seguirlo con una línea nueva ( ENTER ).

Con Windows, la CTRL z se puede ingresar en cualquier lugar de la línea, pero aún debe seguir una nueva línea.

En UNIX, el carácter real para informar a la interfaz del terminal que desea enviar EOF se puede configurar con el comando stty . Si ejecuta stty -a , verá algo como:

 speed 38400 baud; rows 45; columns 150; line = 0; intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = ; eol2 = ; swtch = ^Z; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; -parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo -echoe -echok -echonl -noflsh -tostop -echoctl -echoke 

Puede ver al final de la segunda línea que eof está configurado en ^D ( CTRL d ). Puedes cambiar esto con:

 stty eof ^x 

para establecerlo en CTRL x , por ejemplo. También puede establecer una gran cantidad de otras cosas, la mayoría de las cuales harán que su terminal actual no se pueda usar, así que tenga cuidado 🙂

En stty , si desea indicar a su progtwig que el archivo está terminado, use CTRL d para UNIX (o verifique si no funciona) o CTRL z para Windows. Si solo desea obtener una línea de entrada, use el carácter \n en su código de la siguiente manera:

 #include  int main (void) { long nc = 0; while(getchar() != '\n') ++nc; printf("%ld\n", nc); return 0; } 

¿Cómo terminas tu entrada y en qué sistema estás?

Si está presionando una combinación de teclas de ‘interrupción’ o ‘matar’, es probable que esté matando su proceso antes de que pueda imprimir.

Si usa algo como Ctrl-D en Unix o Ctrl-Z al comienzo de una línea en Windows, esto indicará “fin de la entrada” sin matar el proceso.

También puede intentar redirigir su entrada desde un archivo de prueba. p.ej:

 myprogram  

En Windows, una CTRL-Z o F6 indicará el final de un archivo.

ENTER está escrito en código como '\n' . Prueba esto

 #include  int main(void) { long nc = 0; /* count chars, except for ENTER */ while(getchar() != '\n') { ++nc; } printf("%ld\n", nc); return 0; } 

“Presiona enter”? El ciclo en su código continúa iterando hasta que alcanza el marcador de fin de archivo. “Presionar enter” no dará como resultado EOF. Si desea simular EOF desde el teclado, consulte la documentación de su terminal. En Windows, por ejemplo, tendrías que presionar Ctrl + Z para generar EOF.

getchar () devuelve un valor de estándar en (típicamente el teclado). No recuerdo a qué personaje se asignará EOF, pero probablemente no pueda escribirlo.

EOF trabajando

Escriba sus entradas y presione Enter, luego ctrl + z para Windows y ctrl + d para Unix, luego presione Enter. Lo mismo que puedes ver en la imagen que adjunto. Definitivamente lo hará.