Linuxでconio.hに相当するヘッダーファイルが見つかりません。
Linuxにgetch()
&getche()
関数のオプションはありますか?
ユーザーが1つのキーを押すだけでオプションを指定できるスイッチケースベースメニューを作成し、プロセスを前に移動する必要があります。ユーザーが選択を押した後にEnterキーを押すことはできません。
#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, ¤t); /* 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
#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
を削除します。
Curses.hまたはncurses.hを使用することをお勧めします。これらはgetch()などのキーボード管理ルーチンを実装しています。 getchの動作を変更するためのいくつかのオプションがあります(キープレスを待つかどうか)。
Ncursesライブラリにはgetch()関数があります。 ncurses-devパッケージをインストールすることで入手できます。
上記のように、getch()
はncurses
ライブラリにあります。 ncursesはinitializedである必要があります。つまり、 getchar()は上下の矢印キーに対して同じ値(27)を返します を参照してくださいこの
他の回答で述べたように、Linuxでcurses.h
ライブラリを使用できます。
次の方法でUbuntuにインストールできます。
須藤apt-getアップデート
Sudo apt-get install ncurses-dev
here からインストール部分を取得しました。