2009-11-24 11 views
15

Tengo un pequeño fragmento de código a continuación que estoy ejecutando usando PellesC.¿Por qué getchar() no reconoce return como EOF en la consola?

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

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

#include <stdio.h> 

int main(void) 
{ 
    long nc = 0; 

    while(getchar() != EOF) 
    { 
     ++nc; 
    } 

    printf("%ld\n", nc); 
} 

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

Respuesta

33

Al presionar enter en realidad no se causa un EOF ("fin del archivo"). Debe indicar que ha terminado de proporcionar información; en Unix, normalmente lo hace presionando CtrlD. En Windows creo que es CtrlZ seguido de enter, pero realmente no estoy seguro de eso.

+1

Estoy utilizando Windows y Ctrl + Z es correcto. Gracias, nunca nuevo eso. –

+0

it ** es ** ctrl + z –

4

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

Si está presionando una combinación de teclas de control 'interrumpir' o 'matar', entonces es probable que esté matando su proceso antes de que pueda imprimir.

Si utiliza 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. por ejemplo:

myprogram <input.txt 
1

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

0

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

+1

EOF no se asigna a ningún caracter. EOF tiene un valor negativo, 'getchar()' devuelve el valor del siguiente carácter en la secuencia 'stdin' para' 'unsigned char' ... así que un valor positivo ... o EOF – pmg

+0

** getchar (3) * * es una función 'int', que devuelve' EOF' (típicamente -1) para señalizar el final del archivo. 'EOF' no es un personaje, y esta es la razón por la cual' getchar() 'devuelve un' int' en lugar de 'char'. –

4

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

2

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

#include <stdio.h> 

int main(void) 
{ 
    long nc = 0; 

    /* count chars, except for ENTER */ 
    while(getchar() != '\n') 
    { 
     ++nc; 
    } 

    printf("%ld\n", nc); 
    return 0; 
} 
18

Sólo obtendrá un EOF de la corriente cuando se alcanza el final del archivo, no 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 CTRLd en los sistemas de tipo UNIX y CTRLz 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 nueva línea (ENTER).

Con Windows, el CTRLz se puede introducir en cualquier lugar de la línea, pero todavía tiene que ser seguido por un salto de línea.

En UNIX, el carácter real para informar a la interfaz del terminal que desea enviar EOF se puede establecer con el comando stty. Si se 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 = <undef>; eol2 = <undef>; 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 

Se puede ver al final de la segunda línea que eof se establece en ^D (CTRL d). Puede cambiar esto con:

stty eof ^x 

para establecerlo en CTRLx, por ejemplo. También puede configurar 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 pocas palabras, si desea indicarle a su programa que el archivo está terminado, use CTRLd para UNIX (o comprobar stty si eso no funciona) o CTRL z para Windows. Si desea obtener sólo una línea de entrada , utiliza el carácter \n en el código de la siguiente manera:

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

no use '^ X' en unix ya que se usa en el controlador tty para enviar' SIGSTOP' a procesos de terminal y chocará con el carácter 'EOF'. También en modo cocido, Unix reconoce '^ D' como EOF siempre, sin tener que usar enter antes de after (sin embargo, ** no se reconoce ** en modo raw). Lo que sucede es que una '^ D' hace que una lectura tenga éxito sin retorno, y a veces necesitarás una segunda'^D' para hacer que ** read (2) ** la llamada al sistema devuelva 0 caracteres ('EOF' en Unix se reconoce como una lectura de 0 caracteres). –

+0

@Luis, el CTRL-X fue solo un ejemplo para mostrar cómo cambiarlo, con la advertencia asociada de que posiblemente el terminal no responda. – paxdiablo

0

EOF Working

Escribir sus entradas y pulse Intro continuación ctrl + z para Windows y ctrl + d para Unix luego presione Entrar. Lo mismo que puede ver en la imagen que adjunto. Definitivamente lo será.

Cuestiones relacionadas