Если вы используете 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 с классами»)? Как я уже отмечал, вы можете писать на C ++ и легко получать доступ к этим функциям, и пользователям вашего приложения вряд ли будет важно, как вы его реализовали.