C выход из бесконечного цикла при нажатии клавиш - PullRequest
9 голосов
/ 18 июля 2011

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

Ответы [ 5 ]

5 голосов
/ 18 июля 2011

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

3 голосов
/ 18 июля 2011

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

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

Из Википедия ,

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

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

2 голосов
/ 18 июля 2011

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

Неблокируемый пользовательский ввод в цикле без ncurses.

1 голос
/ 27 декабря 2017

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

#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;
}
0 голосов
/ 14 марта 2016
// 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();
    }
...