как получить персонажа из stdin, не дожидаясь, пока пользователь его поместит?

Я пишу программу C, которая печатает что-то на терминале, используя ncurses. Он должен прекратить печать, когда пользователь нажимает ‘s’, и продолжайте снова, когда нажимаете ‘s’. Как я могу прочитать ключ от ввода без ожидания нажатия кнопки?

Я попробовал getch() и getchar() но они ждут нажатия клавиши …

редактировать

Это мой код:

 int main(void) { initscr(); /* Start curses mode */ refresh(); /* Print it on to the real screen */ int i = 0, j = 0; int state = 0; while (1) { cbreak(); int c = getch(); /* Wait for user input */ switch (c) { case 'q': endwin(); return 0; case 'c': state = 1; break; case 's': state = 0; break; default: state = 1; break; } if(state) { move(i, j); i++; j++; printf("a"); refresh(); } } nocbreak(); return 0; } 

EDIT 2 Это хорошо работает. У меня 100 очков 🙂

 #include  #include  #include  int main(void) { initscr(); noecho(); cbreak(); // don't interrupt for user input timeout(500); // wait 500ms for key press int c = 0; // command: [c|q|s] int s = 1; // state: 1= print, 0= don't print ;-) int i = 0, j = 0; while (c != 'q') { int c = getch(); switch (c) { case 'q': endwin(); return 0; case 'c': s = 1; break; case 's': s = 0; break; default: break; } if (s) { move(i, j); printw("a"); i++; j++; } } endwin(); nocbreak(); return 0; } - #include  #include  #include  int main(void) { initscr(); noecho(); cbreak(); // don't interrupt for user input timeout(500); // wait 500ms for key press int c = 0; // command: [c|q|s] int s = 1; // state: 1= print, 0= don't print ;-) int i = 0, j = 0; while (c != 'q') { int c = getch(); switch (c) { case 'q': endwin(); return 0; case 'c': s = 1; break; case 's': s = 0; break; default: break; } if (s) { move(i, j); printw("a"); i++; j++; } } endwin(); nocbreak(); return 0; } 

ncurses имеет возможность сделать это через собственную функцию getch (). Просмотреть эту страницу

 #include  int main(void) { initscr(); timeout(-1); int c = getch(); endwin(); printf ("%d %c\n", c, c); return 0; } - #include  int main(void) { initscr(); timeout(-1); int c = getch(); endwin(); printf ("%d %c\n", c, c); return 0; } 

Я считаю, что есть ответ на этот вопрос в comp.lang.c fAQ . Я не могу загрузить сайт на данный момент, но загляните в раздел «Системные зависимости».

Поскольку вы используете ncurses, вы начинаете с вызова cbreak чтобы отключить буферизацию строки. Затем вы nodelay чтобы он не дождался, прежде чем вернуться – getch всегда будет немедленно возвращаться. Когда это произойдет, вы проверите, был ли нажат ключ, и если да, то какой ключ был (и реагирует соответствующим образом).