2010-02-02 20 views
7

en el ejemplo:getchar() y putchar()

#include <stdio.h> 

main() 
{ 
    long nc; 

    nc = 0; 
    while (getchar() != EOF) 
     ++nc; 
    printf("%ld\n", nc); 
} 

No entiendo bastante ella. putchar() sacaría el personaje, pero ¿por qué después de EOF saca a todos los personajes y dónde está recordando a todos estos personajes? Gracias.

+5

Umm ... no hay putchar() en este código. – SoapBox

+0

¿De qué 'putchar()' estás hablando? – mob

+2

¡Creo que has publicado el programa equivocado de K & R! –

Respuesta

8

Se llama búfer y se hace por el sistema operativo. Por lo general, hace un buffer de línea donde solo guarda cada carácter que le pone en la memoria, y luego lo escribe todo en el archivo cuando encuentra un salto de línea. Esto ahorra recursos porque las operaciones de archivos toman mucho más tiempo que otras operaciones. Por lo tanto, en lugar de generar resultados con cada carácter, espera a que se reúnan un grupo de caracteres en el búfer y los escribe de una sola vez.

Es solo una hábil maniobra realizada por el sistema operativo de la que usted, el programador, no tiene que preocuparse. Simplemente arroje a sus personajes uno por uno y deje que el SO maneje el resto a su manera.

1

En ningún lado, este código solo vacía la entrada y escribe cuántos caracteres quedan antes de la descarga.

Esto es para asegurarse de que el no es carácteres restantes en el archivo de entrada (entrada estándar)

1

Vamos a revisar su código:

#include <stdio.h> 

Hasta aquí todo bien ...

main() 
{ 
  1. La función main() siempre devuelve un int. Siempre.
  2. Declaración de funciones sin retorno tipo es la falta de forma, ya que por defecto es int, pero la gente no recuerda este código cuando la lectura fácil.

Pasando ...

long nc; 

nc = 0; 

buena forma. La variable se inicializa antes de usarse.

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

Esto es un poco complejo. Pero un paso a la vez.

  1. La función getchar devuelve un int de la entrada estándar.
  2. Ese valor se compara con EOF.
  3. Si el valor int de entrada estándar es no EOF, la variable nc se incrementa.

Para salir del lazo while, se debe generar un EOF a partir de la entrada estándar.

Nota: Ninguno de los valores leídos de la entrada estándar son salvados . Cada valor se descarta después de que se evalúa la expresión.

Estilo: Sugiero usar '{' y '}' después de cada declaración while. Este es un hábito seguro para entrar.

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

La declaración anterior es la impresión (que muestra) el valor en nc. El valor en nc representa el número de caracteres leídos de la entrada estándar. Esta instrucción hace no muestra cualquier carácter de la entrada estándar.

} 

Por último, el programa main debe devolver un valor al sistema operativo. Dos valores portátiles son EXIT_SUCCESS y EXIT_FAILURE, que se definen en stdlib.h. Especificar uno de estos valores también sería un buen hábito.

Por cierto, no hay putchar en el ejemplo que ha publicado (que he copiado en esta respuesta).

1

[Esta no es una respuesta, pero no se puede poner el código en los comentarios]

Creo que quería decir algo como esto:

#include <stdio.h> 

main() 
{ 
    long nc; 
    nc = 0; 
    char c; 
    while ((c = getchar()) != EOF) 
    { 
     putchar(c); /* prints one char */ 
     ++nc; 
    } 
    printf("%ld\n", nc); /* prints the number of characters read */ 
} 
1

putchar poner el carbón en el búfer cuando se trata de una entrada, luego traerá la salida de palabra de línea a la pantalla.

+0

Gracias! También me preguntaba por qué los caracteres no se muestran en la pantalla a medida que los escribe, a pesar de 'putchar()' en el ciclo (no en el código anterior, sino en el ejemplo de KR). – Curious2learn

Cuestiones relacionadas