1

だから私はプログラムを書いています.タスクの1つは、ユーザーがタブを押したかどうかを判断することです. したがって、彼がタブを押すと、コンソールに何かを出力する必要があります(またはタブ補完などを行います)。私の問題は、ユーザーがEnterキーを押さずにそれを行う方法です。ncurses を調べてみましたが、タブでそれを行う方法を教えてくれる簡単な例が見つかりませんでした。

編集:Linuxの使用

4

2 に答える 2

1

技術的には、これはC言語の質問ではなく、オペレーティングシステムまたはランタイム環境の問題です。POSIXシステムでは、少なくとも端末を非正規モードに設定する必要があります。

カノニカルモードは、キーボード入力をバッファリングして、必要に応じてさらに処理します(たとえば、これにより、アプリケーションが文字を表示する前に文字を消去できます)。

非正規モードに切り替える方法はたくさんあります。もちろん、さまざまなライブラリncursesなどを使用できます。しかし、背後にある秘訣は、termiosと呼ばれる一連のシステムコールです。あなたがしなければならないことは、POSIX端末の現在の属性を読み取り、必要に応じてそれらを変更することです。例えば ​​:

struct termios old, new;

/* read terminal attributes */
tcgetattr(STDIN_FILENO,&old);

/* get old settings */
new=old;

/* modify the current settings (common: switch CANON and ECHO) */
new.c_lflag &=(~ICANON & ~ECHO);

/* push the settings on the terminal */
tcsetattr(STDIN_FILENO,TCSANOW,&new);

do_what_you_want_and_read_every_pressed_char();

/* ok, restore initial behavior */
tcsetattr(STDIN_FILENO,TCSANOW,&old);
于 2013-03-13T21:28:40.637 に答える
1

ncursesおよび関数を使用して、入力を操作できgetch()ます。押されたキーの int 値を返します。戻り値が 9 かどうかを調べることで、タブを確認できます。このコードは、タブになるまで押されたものを表示して終了します。

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <ncurses.h>

int main() {  
  int c;
  initscr();    /* Start curses mode */
  cbreak();
  noecho();
  while(9 != (c = getch())) {
    printw("%c\n", c);
    if(halfdelay(5) != ERR) {   /* getch function waits 5 tenths of a second */
      while(getch() == c)
        if(halfdelay(1) == ERR) /* getch function waits 1 tenth of a second */
        break;
    }
    printw("Got a %d\n", c);
    cbreak();
  }
  endwin();
  return 0; 
}
于 2013-03-13T18:11:41.640 に答える