web-dev-qa-db-ja.com

LinuxでCのgetch()関数を実装する方法は?

TurboC++では、_conio.h_のgetch()関数を使用できます。しかしLinuxでは、gccは_conio.h_を提供しません。 getch()の機能を取得するにはどうすればよいですか?

18
Hits

次のconio.hファイルをお試しください:

#include <termios.h>
#include <unistd.h>
#include <stdio.h>

/* reads from keypress, doesn't echo */
int getch(void)
{
    struct termios oldattr, newattr;
    int ch;
    tcgetattr( STDIN_FILENO, &oldattr );
    newattr = oldattr;
    newattr.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
    ch = getchar();
    tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
    return ch;
}

/* reads from keypress, echoes */
int getche(void)
{
    struct termios oldattr, newattr;
    int ch;
    tcgetattr( STDIN_FILENO, &oldattr );
    newattr = oldattr;
    newattr.c_lflag &= ~( ICANON );
    tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
    ch = getchar();
    tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
    return ch;
}

conio.hに似た一部の関数には、gccの ncurses ライブラリを使用することもできます。

27
Shobhit

Cursesをチェックしてください:

http://en.wikipedia.org/wiki/Curses_%28programming_library%29

7
Jamie Wong

画面へのエコーが問題にならない場合は、_stdio.h_からgetchar()を使用してみてください。

6
Carl Smotricz

getch()cursesライブラリ に含まれているようです。

1
che

libcacagetch()に相当するものを使用できます。

__extern int caca_conio_getch (void)
0
Sauron

conio.hはDosのみにあり、

linuxの場合は、

Sudo apt-get install libncurses-dev

そして次に

-lncurses

// IDEでは、リンクする必要があります。例:コードブロック、設定->コンパイラ->リンカ設定、および「ncurses」を追加

0
THEOS

getch()libcursesにあります。 cursesの使用は、基礎となる端末へのディープリンクがあり、初期化する必要があるため、少し複雑です。 libcursesの初期化を伴うcurses getch()の実際の例は次のとおりです getchar()は、上矢印キーと下矢印キーに同じ値(27)を返します

0
ralf htp

Unixでは、getch()はncursesライブラリの一部です。しかし、私は この質問 の回避策を書きました。これにより、残りのcursesの荷物なしでgetchのような機能を使用できます。

0
luser droog

これらのソリューションによると code getch()およびgetche()関数のオープンソースコードを手動で使用する必要があります。

#include <termios.h>
#include <stdio.h>

static struct termios old, new;

/* Initialize new terminal i/o settings */
void initTermios(int echo) 
{
  tcgetattr(0, &old); /* grab old terminal i/o settings */
  new = old; /* make new settings same as old settings */
  new.c_lflag &= ~ICANON; /* disable buffered i/o */
  new.c_lflag &= echo ? ECHO : ~ECHO; /* set echo mode */
  tcsetattr(0, TCSANOW, &new); /* 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);
}

コードのメインメソッドの前に置くだけ

0
Shubham Sharma

何らかの理由でcursesを使用できない場合は、これを試してください。

# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <ctype.h>
# include <termios.h>

/* get a single char from stdin    */
int getch(void)
{
   struct termios oldattr, newattr;
   int ch;
   tcgetattr(0, &oldattr);
   newattr=oldattr;
   newattr.c_lflag &= ~( ICANON | ECHO );
   tcsetattr( 0, TCSANOW, &newattr);
   ch=getchar();
   tcsetattr(0, TCSANOW, &oldattr);
   return(ch);
}
0
piper