2011-07-18 44 views
8

¿Cómo puedo salir de un bucle infinito, cuando se pulsa una tecla? Actualmente estoy usando getch, pero comenzará a bloquear mi ciclo tan pronto, ya que no hay más entradas para leer.C salida de bucle infinito al pulsar tecla

+0

Usted solía ser capaz de usar 'while (! Kbhit())', pero esto depende prolly del sistema operativo. Es posible que desee echar un vistazo a http://cboard.cprogramming.com/c-programming/63166-kbhit-linux.html, dependiendo de su sistema operativo – forsvarir

+0

Salida Función GetAsyncKeyState si está usando Windows. – Juho

+0

kbhit() puede depender del sistema operativo, pero se declara en conio.h, al igual que getch(). Entonces, si él/ella usa getch(), él/ella debería tener kbhit() también. –

Respuesta

4

Si está utilizando getch() de conio.h de todos modos, intente utilizar kbhit() en su lugar. Tenga en cuenta que tanto getch() y kbhit() - conio.h, de hecho - no son estándar C.

+0

Sí, conio.h no es estándar porque dependen del sistema operativo que se haya utilizado. –

+1

No todas las implementaciones de C tienen conio.h en absoluto, aunque muchas intentan proporcionar una, estos días. Cómo o si se implementan depende de la plataforma, de hecho. –

2

La función de kbhit()conio.h retornos valor distinto de cero si no se pulsa ninguna tecla, pero que no bloquea como getch(). Ahora, esto obviamente no es estándar. Pero como ya está usando getch() desde conio.h, creo que su compilador tiene esto.

if (kbhit()) { 
    // keyboard pressed 
} 

De Wikipedia,

conio.h es un archivo de cabecera de C utilizado en los antiguos compiladores MS-DOS para crear interfaces de usuario de texto. No está descrito en el libro The C Programming Language, y no forma parte de la biblioteca estándar C, ISO C ni es requerido por POSIX.

La mayoría de los compiladores C que se dirigen a DOS, Windows 3.x, Phar Lap, DOSX, OS/2 o Win32 1 tienen este encabezado y proporcionan las funciones de biblioteca asociadas en la biblioteca C predeterminada. La mayoría de los compiladores de C que se dirigen a UNIX y Linux no tienen este encabezado y no proporcionan las funciones de la biblioteca.

0
// Include stdlib.h to execute exit function 
int char ch; 
int i; 

clrscr(); 
void main(){ 

printf("Print 1 to 5 again and again"); 
while(1){ 
for(i=1;i<=5;i++) 

    printf("\n%d",i); 

    ch=getch(); 
    if(ch=='Q')// Q for Quit 
    exit(0); 

    }//while loop ends here 

    getch(); 
    } 
0

Si no desea utilizar no estándar, modo de no bloqueo y salida pero elegante. Use las señales y Ctrl + C con el manejador de señal provisto por el usuario para realizar la limpieza. Algo como esto:

#include <stdio.h> 
#include <signal.h> 
#include <stdlib.h> 

/* Signal Handler for SIGINT */ 
void sigint_handler(int sig_num) 
{ 
    /* Reset handler to catch SIGINT next time. 
     Refer http://en.cppreference.com/w/c/program/signal */ 
    printf("\n User provided signal handler for Ctrl+C \n"); 

    /* Do a graceful cleanup of the program like: free memory/resources/etc and exit */ 
    exit(0); 
} 

int main() 
{ 
    signal(SIGINT, sigint_handler); 

    /* Infinite loop */ 
    while(1) 
    { 
     printf("Inside program logic loop\n"); 
    } 
    return 0; 
} 
Cuestiones relacionadas