4

ncurses を使用して端末に何かを表示する C プログラムを作成しています。ユーザーが「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 <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.cFAQにあります。質問19.1「RETURNキーを待たずにキーボードから1文字を読み取るにはどうすればよいですか?入力時に文字が画面にエコーされないようにするにはどうすればよいですか?」を参照してください。

ここに投稿するのは少し長いです。

于 2011-10-14T19:07:48.457 に答える