¿Cómo funciona getchar ()?

Estoy confundido por un progtwig mencionado en K & R que usa getchar() . Da el mismo resultado que la cadena de entrada:

 #include  main(){ int c; c = getchar(); while(c != EOF){ putchar(c); c = getchar(); } } 

¿Por qué imprime toda la cadena? Esperaría que leyera un personaje y preguntara nuevamente por la entrada.

Y, ¿son todas las cadenas que ingresamos terminadas por un EOF?

En la configuración simple que probablemente esté usando, getchar funciona con entrada almacenada , por lo que debe presionar enter antes de que Getchar obtenga algo para leer. Las cadenas no son terminadas por EOF ; de hecho, EOF no es realmente un personaje, sino un valor mágico que indica el final del archivo. Pero EOF no es parte de la cadena de lectura. Es lo que getchar devuelve cuando no queda nada por leer.

Hay un buffer / stream subyacente que getchar () y amigos leen. Cuando ingresa texto, el texto se almacena en un búfer en algún lugar. getchar () puede transmitirlo un carácter a la vez. Cada lectura devuelve el siguiente carácter hasta que alcanza el final del búfer. La razón por la que no le pide caracteres posteriores es que puede obtener la siguiente del búfer.

Si ejecuta su secuencia de comandos y escribe directamente en ella, continuará solicitando su entrada hasta que presione CTRL + D (fin del archivo). Si lo llamas como ./program

Como advertencia adicional, creo que getchar () también devolverá EOF si encuentra un error, por lo que querrá verificar ferror (). Ejemplo a continuación (no probado, pero entiendes la idea).

 main() { int c; do { c = getchar(); if (c == EOF && ferror()) { perror("getchar"); } else { putchar(c); } } while(c != EOF); } 

Las cadenas, por definición de C , son terminadas por '\0' . No tiene "C strings" en su progtwig.

El progtwig lee los caracteres (almacenados en el búfer hasta ENTER) desde la entrada estándar (el teclado) y los vuelve a escribir en la salida estándar (la pantalla). Hace esto sin importar cuántos caracteres escriba o por cuánto tiempo lo hace.

Para detener el progtwig, debe indicar que la entrada estándar no tiene más datos (¿cómo puede un teclado no tener más datos?) .

Simplemente escriba Ctrl+D (Unix) o Ctrl+Z (Windows) para simular que el archivo ha llegado a su fin.
Ctrl+D (o Ctrl+Z ) no son realmente caracteres en el sentido C de la palabra.

Si ejecuta su progtwig con la redirección de entrada, el EOF es el final real del archivo, no una creencia uno
./a.out < source.c

getchar () lee un solo carácter de entrada y devuelve ese carácter como el valor de la función. Si hay un error al leer el carácter, o si se llega al final de la entrada, getchar () devuelve un valor especial, representado por “EOF”.

De acuerdo con la definición de getchar (), lee un carácter de la entrada estándar. Desafortunadamente stdin se confunde con el teclado, que podría no ser el caso de getchar. getchar usa un buffer como stdin y lee un solo caracter a la vez. En su caso, dado que no hay EOF, el getchar y el putchar se ejecutan varias veces y le parece que la secuencia completa se imprime a la vez. haz un pequeño cambio y entenderás:

 putchar(c); printf("\n"); c = getchar(); 

Ahora mira la salida en comparación con el código original.

Otro ejemplo que le explicará el concepto de getchar y stdin búfer:

 void main(){ int c; printf("Enter character"); c = getchar(); putchar(); c = getchar(); putchar(); } 

Ingrese dos caracteres en el primer caso. La segunda vez que se ejecuta getchar, ¿está ingresando un personaje? NO, pero aún funciona putchar.

Esto en última instancia significa que hay un búfer y cada vez que escriba algo y haga clic en Entrar, esto se ejecuta y se instala en el búfer. getchar usa este buffer como stdin.