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