如何从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; } 

编辑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; } 

ncurses有能力通过它自己的getch()函数来完成这项工作。 见本页

 #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将始终立即返回。 如果是这样,你将检查是否按下了一个键,如果是,那么键是什么键(并做出适当的反应)。