Если вы работаете в Windows, вы можете использовать kbhit()
, который является частью библиотеки времени выполнения Microsoft. Если вы на Linux, вы можете реализовать kbhit
таким образом (source):
#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;
}
Update: выше функция работает на OS X (по крайней мере, на OS X 10.5.8 - Leopard, так что я бы ожидайте, что он будет работать над более поздними версиями OS X). Это gist может быть сохранен как kbhit.c
и скомпилирован как на Linux и OS X с
gcc -o kbhit kbhit.c
При запуске с
./kbhit
Это побуждает вас нажатие клавиши, и выходит, когда вы нажмете клавишу (не ограничено для ввода или печати).
@Johnsyweb - пожалуйста, уточните, что вы подразумеваете под «подробным каноническим ответом» и «всеми проблемами». Кроме того, перекрестная платформа: с этой реализацией kbhit()
вы можете иметь одинаковую функциональность в программе на C++ в Linux/Unix/OS X/Windows - на каких других платформах вы можете ссылаться?
Дальнейшее обновление для @Johnsyweb: Приложения на C++ не живут в герметично закрытой среде C++. Большой причиной успеха C++ является совместимость с C. Все основные платформы реализованы с помощью C-интерфейсов (даже если внутренняя реализация использует C++), поэтому ваши разговоры о «наследии» кажутся неуместными. Кроме того, поскольку мы говорим об одной функции, зачем вам C++ для этого («C с классами»)? Как я уже сказал, вы можете написать на C++ и легко получить доступ к этой функции, и пользователям вашего приложения вряд ли понравится , как вы его внедрили.
Какой ОС вы используете? – Lucas
Насколько я знаю, проблема в том, что ваша оболочка ждет вас, чтобы нажать ENTER или EOF, а затем позволит вашей программе заботиться о том, что находится в буфере, или что-то вроде этого. Может быть, кто-нибудь, обладающий некоторыми знаниями, может дать реальное объяснение. Но я думаю, что это не так просто, как кажется на первый взгляд. – Lucas
Самым простым способом справиться с этим и единственным переносным способом является изменение приглашения от «Нажмите любую клавишу, чтобы продолжить» до «Нажмите клавишу« Ввод », чтобы продолжить». –