4

我正在编写一个 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;
}
4

3 回答 3

4

ncurses 有能力通过它自己的 getch() 函数来做到这一点。看到这个页面

#include <curses.h>

int main(void) {
  initscr();
  timeout(-1);
  int c = getch();
  endwin();
  printf ("%d %c\n", c, c);
  return 0;
}
于 2011-10-14T19:07:01.040 回答
0

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

于 2011-10-14T19:12:27.473 回答
-2

在comp.lang.c FAQ中有一个答案。请参阅问题 19.1,“如何在不等待 RETURN 键的情况下从键盘读取单个字符?如何阻止字符在键入时在屏幕上回显?”。

在这里发帖有点长。

于 2011-10-14T19:07:48.457 回答