Comment faire pour exécuter le programme tout en écoutant pour la saisie de l’utilisateur en C?

J’essaie de créer un jeu qui continue à fonctionner jusqu’à ce qu’une touche soit enfoncée. Il devrait ensuite saisir cette clé et en faire quelque chose, puis continuer à fonctionner normalement. Comment puis-je faire cela?

Je suis sur MAC alors, même si je suis tombé sur une bibliothèque Windows appelée conio.h qui peut gérer cela avec kbhit () et getch (), je ne peux pas le faire fonctionner pour moi …

// // main.c // conioTesting // // #include  #include "myconio_mac.h" int main(int argc, const char * argv[]) { int counter = 0; while (counter < 2) { if (kbhit()) { char key = getch(); printf("\n Key is %c \n", key); printf("Keyboard hit detected \n"); } else { printf("Nothing. \n"); } } printf("Passed!!!!!!!!!! \n"); } 

Sur le MAC, vous devez modifier les parameters du terminal pour désactiver la mise en mémoire tampon des lignes. (Vous pouvez également désactiver l’écho.) Une fois que le terminal est configuré correctement, vous pouvez utiliser read pour obtenir des caractères uniques à partir du clavier.

Dans l’exemple de code ci-dessous, la fonction kbsetup prend en charge les parameters du terminal. La fonction getkey vérifie si une touche est enfoncée et renvoie la clé, le cas échéant, ou '\0' si aucune clé n’a été lue. La fonction main a une boucle qui imprime l’heure une fois par seconde et imprime toute touche sur laquelle l’utilisateur appuie. Appuyez sur 'q' pour quitter le programme.

 #include  #include  #include  #include  #include  #include  static struct termios oldSettings; void kbcleanup( void ) { tcsetattr( 0, TCSAFLUSH, &oldSettings ); /* restore old settings */ } void kbsetup( void ) { tcgetattr( 0, &oldSettings ); struct termios newSettings = oldSettings; newSettings.c_lflag &= ~ICANON; /* disable line-at-a-time input */ newSettings.c_lflag &= ~ECHO; /* disable echo */ newSettings.c_cc[VMIN] = 0; /* don't wait for characters */ newSettings.c_cc[VTIME] = 0; /* no minimum wait time */ if ( tcsetattr( 0, TCSAFLUSH, &newSettings ) == 0 ){ atexit( kbcleanup ); /* restore the terminal settings when the program exits */ } else { fprintf( stderr, "Unable to set terminal mode\n" ); exit( 1 ); } } int getkey( void ) { char c; if ( read( STDIN_FILENO, &c, 1 ) == 0 ) return '\0'; else return c; } int main( void ) { int c; kbsetup(); time_t start = time( NULL ); time_t previous = start; for (;;) { usleep( 1000 ); time_t current = time( NULL ); if ( current != previous ) { fprintf( stderr, "tick %3ld\r", current - start ); previous = current; } else if ( (c = getkey()) != '\0' ) { if ( c == 'q' || c == 'Q' ) break; printf( "\ngot char: 0x%02x", c ); if ( isprint( c ) ) printf( " '%c'", c ); printf( "\n" ); } } } 

On dirait que vous voulez attendre que vous appuyiez sur une touche, puis continuer l’exécution:

 //test.c #include  #include  void *input_listener(void *threadarg) { getchar(); printf("A key was pressed.\n"); } int main() { printf("Start\n"); pthread_t thread; pthread_create(&thread, NULL, input_listener, NULL); pthread_join(thread, NULL); // Continue main } 

Devrait être très simple à faire avec pthreads (besoin de comstackr: gcc test.c -lpthread ).

Vous pouvez consulter les réponses mentionnées sur un autre post de stackoverflow:

Problème avec kbhit () [et getch ()] pour Linux