如何从stdin获取一个字符而无需等待用户放置它?

时间:2011-10-14 19:02:32

标签: c ncurses curses

我正在编写一个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 <stdio.h>
#include <stdlib.h>
#include <curses.h>

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

3 个答案:

答案 0 :(得分:4)

ncurses有能力通过它自己的getch()函数来完成这项工作。请参阅this页面

#include <curses.h>

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

答案 1 :(得分:0)

我相信在comp.lang.c fAQ中有一个答案。我目前无法加载网站,但请查看“系统依赖关系”部分。

答案 2 :(得分:0)

由于您正在使用ncurses,因此首先调用cbreak来关闭行缓冲。然后你会打电话给nodelay告诉它不要在返回之前等待 - getch将永远立即返回。如果是这样,你将检查是否按下了一个键,如果是,那么键是什么键(并做出适当的反应)。