C выход из бесконечного цикла при нажатии клавиши

Как я могу выйти из бесконечного цикла, когда нажата клавиша? В настоящее время я использую getch, но он начнет блокировать мой цикл, как только больше нет ввода для чтения.

5 ответов


Я бы предложил вам перейти к этой статье.

неблокирующий ввод данных в цикле без библиотеки.


если вы используете getch() с conio.h в любом случае, попробуйте использовать kbhit() вместо. Обратите внимание, что оба getch() и kbhit() -conio.h, на самом деле-не являются стандартными C.


функции kbhit() С conio.h возвращает ненулевое значение, если нажата какая-либо клавиша, но она не блокируется как getch(). Это явно не стандарт. Но, как вы уже используете getch() С conio.h, Я думаю, что ваш компилятор это.

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

С Википедия,

попечительством.h-это файл заголовка C, используемый в старых компиляторах MS-DOS для создания текстовых пользовательских интерфейсов. Это не описано в книге языка программирования C, и это не часть стандартной библиотеки C, ISO C и не требуется POSIX.

большинство компиляторов C, предназначенных для DOS, Windows 3.x, Phar Lap, DOSX, OS / 2 или Win321 имейте этот заголовок и поставьте связанные библиотечные функции в библиотеке C по умолчанию. Большинство компиляторов C, предназначенных для UNIX и Linux, не имеют этого заголовка и не предоставляют библиотечные функции.


// 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();
    }

Если вы не хотите использовать нестандартный, неблокирующий способ и все же изящный выход. Используйте сигналы и Ctrl+C с обработчиком сигнала обеспеченным потребителем для того чтобы очистить вверх. Что-то вроде этого:--4-->

#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;
}