Nếu đang sử dụng Windows, bạn có thể sử dụng kbhit()nó là một phần của thư viện thời gian chạy của Microsoft. Nếu bạn đang sử dụng Linux, bạn có thể triển khai kbhitnhư vậy ( nguồn ):
#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;
}
Cập nhật: Chức năng trên hoạt động trên OS X (ít nhất, trên OS X 10.5.8 - Leopard, vì vậy tôi hy vọng nó sẽ hoạt động trên các phiên bản OS X mới hơn). Đây ý chính có thể được lưu lại dưới dạng kbhit.cvà biên soạn trên cả Linux và OS X với
gcc -o kbhit kbhit.c
Khi chạy với
./kbhit
Nó nhắc bạn nhấn phím và thoát ra khi bạn nhấn một phím (không giới hạn ở phím Enter hoặc phím có thể in được).
@Johnsyweb - vui lòng giải thích rõ ý bạn về "câu trả lời kinh điển chi tiết" và "tất cả các mối quan tâm". Ngoài ra, lại "đa nền tảng": Với việc triển khai này, kbhit()bạn có thể có chức năng tương tự trong chương trình C ++ trên Linux / Unix / OS X / Windows - bạn có thể đề cập đến nền tảng nào khác?
Cập nhật thêm cho @Johnsyweb: Các ứng dụng C ++ không sống trong môi trường C ++ kín. Một lý do lớn cho sự thành công của C ++ là khả năng tương tác với C. Tất cả các nền tảng chính thống đều được triển khai với giao diện C (ngay cả khi việc triển khai nội bộ đang sử dụng C ++) nên việc bạn nói về "di sản" có vẻ không đúng chỗ. Ngoài ra, khi chúng ta đang nói về một hàm duy nhất, tại sao bạn cần C ++ cho điều này ("C với các lớp")? Như tôi đã chỉ ra, bạn có thể viết bằng C ++ và truy cập chức năng này một cách dễ dàng và người dùng ứng dụng của bạn có thể không quan tâm đến cách bạn triển khai nó.