Якщо ви працюєте в ОС Windows, ви можете використовувати те, kbhit()що є частиною бібліотеки часу роботи Microsoft. Якщо ви працюєте на Linux, ви можете реалізувати kbhitтаким чином ( джерело ):
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
int kbhit(void)
{
struct termios oldt, newt;
int ch;
int oldf;
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);
ch = getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
fcntl(STDIN_FILENO, F_SETFL, oldf);
if(ch != EOF)
{
ungetc(ch, stdin);
return 1;
}
return 0;
}
Оновлення: вищевказана функція працює на OS X (принаймні, на OS X 10.5.8 - Leopard, тому я очікував би, що вона буде працювати і в новіших версіях OS X). Цей суть можна зберегти як kbhit.cі скомпілювати як на Linux, так і на OS X за допомогою
gcc -o kbhit kbhit.c
При запуску з
./kbhit
Він пропонує вам натиснути клавішу та вийти, коли ви натискаєте клавішу (не обмежуючись клавішами Enter або друку).
@Johnsyweb - будь ласка, детально поясніть, що ви маєте на увазі під "детальною канонічною відповіддю" та "всіма проблемами". Крім того, повторно "крос-платформа": за допомогою цієї реалізації kbhit()ви можете мати однакову функціональність у програмі C ++ на Linux / Unix / OS X / Windows - на які інші платформи ви можете посилатися?
Подальше оновлення для @Johnsyweb: Програми C ++ не працюють у герметично закритому середовищі C ++. Головною причиною успіху С ++ є взаємодія з C. Всі основні платформи реалізовані з інтерфейсами C (навіть якщо внутрішня реалізація використовує C ++), тому ваші розмови про "застарілий" виглядають недоречними. Плюс, оскільки ми говоримо про одну функцію, навіщо для цього потрібен C ++ ("C з класами")? Як я вже зазначав, ви можете писати на C ++ і легко отримувати доступ до цієї функціональності, і користувачам вашого додатку навряд чи буде все одно, як ви її реалізували.