2010-03-09 7 views
16

Estoy confundido con el rol de getchar() en el siguiente código. Quiero decir que sé que me está ayudando a ver la ventana de salida que solo se cerrará cuando presione Ingrese la clave.Confundido acerca de la función getchar()

Así que getchar() básicamente está esperando que presione enter y luego lea un solo carácter.

¿Cuál es el único carácter que está leyendo esta función? No presioné ninguna tecla del teclado para que se lea.

Ahora, cuando no está leyendo nada, ¿por qué no da un error que dice "hey, no ingresaste nada para que lo leyera"?

#include <stdio.h> 

int main() 
{ 
    printf("blah \n"); 
    getchar(); 
    return 0; 
} 
+2

getchar() seguirá esperando indefinidamente hasta que se presione una tecla. Es tu sirviente –

+4

¡Bienvenido a stackoverflow! Las preguntas de los principiantes son totalmente correctas aquí, siempre que estén de acuerdo con el tema. La tuya es en realidad una pregunta bastante buena, ya que aborda un concepto importante. – sleske

+1

Intente mantener su título cerca del tema de la pregunta, esto ayudará a otros que estén buscando algo similar. He editado tu título para reflejar la pregunta. Bienvenido a Stack Overflow :) –

Respuesta

8

La función getchar() simplemente esperará hasta que reciba un carácter, manteniendo el programa hasta que lo haga.

Se envía un carácter cuando se presiona la tecla Intro; bajo un sistema operativo Windows, enviará un retorno de carro (CR) y un avance de línea (LF).

Consulte this CodingHorror post para una explicación muy buena.

(... la explicación de la parte CR + LF, no la pieza de bloqueo getchar())

+0

Gracias por publicar el enlace. –

11

Esto se debe a getchar() es una función bloqueo.

Deberías leer sobre blocking functions, que básicamente hace que el proceso espere para que suceda algo.

La implementación de este comportamiento de espera depende de la función, pero normalmente es un bucle que espera que ocurra algún evento.

Para el caso de la función getchar(), esto probablemente se implementa como un bucle que lee constantemente un archivo (stdin para este caso) y verifica si el archivo está modificado. Si el archivo se modifica, el ciclo se comporta haciendo otra cosa.

+0

Creo que Voy a leer sobre ellos también. ¿Es eso (basado en la descripción del usuario) más como un detector de eventos o una interrupción (o ninguno y yo soy el que tiene las preguntas tontas)? – Anthony

+0

@Anthony: la implementación interna es diferente: cuando accede directamente a HW (como en lectura desde un puerto serie), por lo general será controlado por interrupciones. Si está leyendo desde una ventana de consola en un entorno de GUI, getchar probablemente recibirá algún tipo de evento desde el marco de la GUI. – sleske

2

getchar() bloquea la ejecución de su programa hasta que se presione una tecla. Entonces, no hay error si no se presiona ninguna tecla, getchar() esperará que ocurra :)

4

Prueba esto:

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    char ch; 

    printf("I'm now going to block until you press something and then return... "); 

    ch = getchar(); 

    if (ch >= 0) 
     printf("\nYou pressed %c\n", ch); 
    else 
     printf("\nAliens have taken over standard input! Run!\n"); 

    return 0; 
} 

getchar() hará que su programa para ir a dormir hasta ke yboard (o lo que esté conectado a stdin) se recibe la interrupción. Esto significa que está bloqueando, no se ejecutará ningún código adicional hasta que getchar() regrese.

Es muy, muy útil mirar el valor de retorno de una función para comprenderlo.

Cualquier función puede bloquear, a menos que proporcione algún mecanismo para evitar el bloqueo.Por ejemplo, open() permite un indicador O_NONBLOCK que es útil para abrir dispositivos de respuesta lenta como módems. En resumen, si recibe información de un terminal o tiene que esperar para obtener una respuesta del kernel o de algún dispositivo, es muy probable que se bloquee.

Cuestiones relacionadas