Si está en Windows, puede usar el kbhit()que forma parte de la biblioteca de tiempo de ejecución de Microsoft. Si está en Linux, puede implementarlo kbhitasí ( fuente ):
#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;
}
Actualización: la función anterior funciona en OS X (al menos, en OS X 10.5.8 - Leopard, por lo que esperaría que funcione en versiones más recientes de OS X). Esta esencia se puede guardar kbhit.cy compilar tanto en Linux como en OS X con
gcc -o kbhit kbhit.c
Cuando se ejecuta con
./kbhit
Le solicita que presione una tecla y sale cuando presiona una tecla (no se limita a Enter o teclas imprimibles).
@Johnsyweb : explique lo que quiere decir con "respuesta canónica detallada" y "todas las preocupaciones". Además, vuelva a ser "multiplataforma": con esta implementación kbhit(), puede tener la misma funcionalidad en un programa C ++ en Linux / Unix / OS X / Windows. ¿A qué otras plataformas se está refiriendo?
Actualización adicional para @Johnsyweb: las aplicaciones C ++ no viven en un entorno C ++ herméticamente sellado. Una gran razón del éxito de C ++ es la interoperabilidad con C. Todas las plataformas principales se implementan con interfaces C (incluso si la implementación interna usa C ++), por lo que su discurso de "legado" parece fuera de lugar. Además, como estamos hablando de una sola función, ¿por qué necesita C ++ para esto ("C con clases")? Como señalé, puede escribir en C ++ y acceder a esta funcionalidad fácilmente, y es poco probable que a los usuarios de su aplicación les importe cómo la implementó.