web-dev-qa-db-ja.com

Linuxのgetch()およびgetche()と同等のものは何ですか?

Linuxでconio.hに相当するヘッダーファイルが見つかりません。

Linuxにgetch()getche()関数のオプションはありますか?

ユーザーが1つのキーを押すだけでオプションを指定できるスイッチケースベースメニューを作成し、プロセスを前に移動する必要があります。ユーザーが選択を押した後にEnterキーを押すことはできません。

55
Jeegar Patel
#include <termios.h>
#include <stdio.h>

static struct termios old, current;

/* Initialize new terminal i/o settings */
void initTermios(int echo) 
{
  tcgetattr(0, &old); /* grab old terminal i/o settings */
  current = old; /* make new settings same as old settings */
  current.c_lflag &= ~ICANON; /* disable buffered i/o */
  if (echo) {
      current.c_lflag |= ECHO; /* set echo mode */
  } else {
      current.c_lflag &= ~ECHO; /* set no echo mode */
  }
  tcsetattr(0, TCSANOW, &current); /* use these new terminal i/o settings now */
}

/* Restore old terminal i/o settings */
void resetTermios(void) 
{
  tcsetattr(0, TCSANOW, &old);
}

/* Read 1 character - echo defines echo mode */
char getch_(int echo) 
{
  char ch;
  initTermios(echo);
  ch = getchar();
  resetTermios();
  return ch;
}

/* Read 1 character without echo */
char getch(void) 
{
  return getch_(0);
}

/* Read 1 character with echo */
char getche(void) 
{
  return getch_(1);
}

/* Let's test it out */
int main(void) {
  char c;
  printf("(getche example) please type a letter: ");
  c = getche();
  printf("\nYou typed: %c\n", c);
  printf("(getch example) please type a letter...");
  c = getch();
  printf("\nYou typed: %c\n", c);
  return 0;
}

出力:

(getche example) please type a letter: g
You typed: g
(getch example) please type a letter...
You typed: g
69
niko
#include <unistd.h>
#include <termios.h>

char getch(void)
{
    char buf = 0;
    struct termios old = {0};
    fflush(stdout);
    if(tcgetattr(0, &old) < 0)
        perror("tcsetattr()");
    old.c_lflag &= ~ICANON;
    old.c_lflag &= ~ECHO;
    old.c_cc[VMIN] = 1;
    old.c_cc[VTIME] = 0;
    if(tcsetattr(0, TCSANOW, &old) < 0)
        perror("tcsetattr ICANON");
    if(read(0, &buf, 1) < 0)
        perror("read()");
    old.c_lflag |= ICANON;
    old.c_lflag |= ECHO;
    if(tcsetattr(0, TCSADRAIN, &old) < 0)
        perror("tcsetattr ~ICANON");
    printf("%c\n", buf);
    return buf;
 }

文字を表示したくない場合は、最後のprintfを削除します。

31
mf_

Curses.hまたはncurses.hを使用することをお勧めします。これらはgetch()などのキーボード管理ルーチンを実装しています。 getchの動作を変更するためのいくつかのオプションがあります(キープレスを待つかどうか)。

7
Fafaman

Ncursesライブラリにはgetch()関数があります。 ncurses-devパッケージをインストールすることで入手できます。

4
Jan S

上記のように、getch()ncursesライブラリにあります。 ncursesはinitializedである必要があります。つまり、 getchar()は上下の矢印キーに対して同じ値(27)を返します を参照してくださいこの

0
ralf htp

他の回答で述べたように、Linuxでcurses.hライブラリを使用できます。

次の方法でUbuntuにインストールできます。

須藤apt-getアップデート

Sudo apt-get install ncurses-dev

here からインストール部分を取得しました。

0
Ashish Ahuja