Como vocês devem saber o teclado possui um buffer circular que armazena os últimos caracteres digitados, então quando você lê uma tecla digitada, provavelmente ela não é a tecla que o usuário digitou neste exato momento, mas sim o código da tecla mais antiga existente no buffer.
Isto é bom para a maioria das aplicações, como por exemplo editores de texto, mas com certeza não é uma boa solução para jogos estilo arcade (ex. River Raider) e não para aplicações de controle de tempo-real.
Felizmente é possível ignorar ou minimixar os efeitos do buffer do teclado.
Este código abaixo faz exatamente isso pra você:
#include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #include <fcntl.h> #include <termios.h> int main() { struct termios oldSettings, newSettings; tcgetattr( fileno( stdin ), &oldSettings ); newSettings = oldSettings; newSettings.c_lflag &= (~ICANON & ~ECHO); tcsetattr( fileno( stdin ), TCSANOW, &newSettings ); while ( 1 ) { fd_set set; struct timeval tv; tv.tv_sec = 10; tv.tv_usec = 0; FD_ZERO( &set ); FD_SET( fileno( stdin ), &set ); int res = select( fileno( stdin )+1, &set, NULL, NULL, &tv ); if( res > 0 ) { char c; printf( "Input available\n" ); read( fileno( stdin ), &c, 1 ); } else if( res < 0 ) { perror( "select error" ); break; } else { printf( "Select timeout\n" ); } } tcsetattr( fileno( stdin ), TCSANOW, &oldSettings ); return 0; }
Fonte: http://www.cplusplus.com/forum/beginner/5619/#msg25139