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;
}
업데이트 : 위의 기능은 OS X에서 작동합니다 (적어도 OS X 10.5.8-Leopard에서 작동하므로 OS X의 최신 버전에서 작동 할 것으로 예상합니다). 이 요점 은 다음 kbhit.c을 사용하여 Linux 및 OS X에서 저장 하고 컴파일 할 수 있습니다.
gcc -o kbhit kbhit.c
함께 실행할 때
./kbhit
키를 누르라는 메시지가 표시되고 키를 누르면 종료됩니다 (Enter 또는 인쇄 가능한 키에 국한되지 않음).
@Johnsyweb- "상세한 표준 답변"과 "모든 우려 사항"이 의미하는 바를 자세히 설명해주십시오. 또한 "크로스 플랫폼":이 구현을 kbhit()통해 Linux / Unix / OS X / Windows의 C ++ 프로그램에서 동일한 기능을 사용할 수 있습니다. 다른 플랫폼을 참조 할 수 있습니까?
@Johnsyweb에 대한 추가 업데이트 : C ++ 응용 프로그램은 밀폐 된 C ++ 환경에 있지 않습니다. C ++의 성공에 대한 큰 이유는 C와의 상호 운용성입니다. 모든 주류 플랫폼은 C 인터페이스로 구현됩니다 (내부 구현에서 C ++를 사용하는 경우에도). 따라서 "레거시"에 대한 이야기는 적절하지 않은 것처럼 보입니다. 게다가 우리가 단일 함수에 대해 이야기하고 있는데 왜 이것을 위해 C ++ ( "C with classes")가 필요합니까? 내가 지적했듯이 C ++로 작성하고이 기능에 쉽게 액세스 할 수 있으며 애플리케이션의 사용자는이 를 구현 하는 방법 에 관심이 없을 것입니다.