Intereting Posts
Множественное назначение в одной строке Ошибки Valgrind, вызванные pclose () в Mac OS X как перехватывать сигналы Linux? (в С) В чем разница между кодом физического ключа SDL и кодом виртуального ключа SDL? Будет ли компилятор поставить таблицу перехода в конце функции? Что будет возвращать функция, если нет явного «return» Неисправность чтения строки с запятой в Неожиданные результаты по разности беззнаковых ints Как реализовать очередь с односвязным списком, чтобы ее ENQUEUE и DEQUEUE принимали O (1)? Сортировка динамического массива в структуре с помощью C qsort () Есть ли способ заглянуть в буфер stdin? Использовать fscanf для чтения с данной строки c udp неблокирующий сокет с recvfrom и выберите Повреждение кучи – ошибка отладки не удалась. в выражении dbgheap.c 1322 выражение _crtIsValidHeapPointer (pUserData) Игра жизни Конвей: изменения ячейки вычисляются неправильно после изменения функции подсчета соседей

Как запустить программу во время прослушивания ввода пользователя в C?

Я пытаюсь сделать игру, которая продолжает работать до тех пор, пока не будет нажата клавиша, а затем она должна взять этот ключ и что-то сделать с ним, а затем продолжить работать как обычно. Как мне это сделать?

Я на MAC, так что, хотя я столкнулся с библиотекой окон, называемой conio.h, которая может справиться с этим с помощью kbhit () и getch (), я не могу заставить это работать для меня …

// // 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"); } 

На MAC вы должны возиться с настройками терминала, чтобы отключить буферизацию строк. (Вы также можете отключить эхо.) Как только терминал настроен правильно, вы можете использовать read для получения отдельных символов с клавиатуры.

В приведенном ниже примере кода функция kbsetup выполняет настройки терминала. Функция getkey проверяет нажатие клавиши и возвращает ключ, если он есть, или '\0' если не было прочитано ни одной клавиши. main функция имеет цикл, который печатает время один раз в секунду и печатает любую клавишу, которую пользователь нажимает. Нажмите 'q' чтобы выйти из программы.

 #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" ); } } } 

Похоже, вы хотите дождаться нажатия клавиши, а затем продолжить выполнение:

 //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 } 

Должно быть очень просто сделать с pthreads (необходимо скомпилировать: gcc test.c -lpthread ).

Вы можете проверить ответы, упомянутые в другой статье stackoverflow:

Проблема с kbhit () [и getch ()] для Linux