我无法在Linux中找到conio.h的等效头文件。

在Linux中getch()getche()函数是否可以使用?

我想制作一个切换案例基​​础菜单,用户只需按一个键即可选择选项,并且过程应向前移动。我不想让用户按下选择后按ENTER。

评论

看看这些答案。可能会帮助您:stackoverflow.com/questions/1513734/…

#1 楼

#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


评论


谢谢,它有效,但是我不得不用其他东西代替new,因为我猜这是一个关键字

– Mihai Vilcu
2013年6月4日19:33

@cipher在Windows上,中的Windows API中包含_getch。

– Paul Stelian
17年1月7日在21:01

@MihaiVilcu new是C ++中的关键字,但不是C中的关键字。

– Paul Stelian
17年1月7日在21:01

@PaulStelian那时我使用的是mingw-gcc,如果我的记性很好,则它没有conio或termios。

–密码
17年1月12日在16:24

此示例中有一个错误:当echo为true时new.c_lflag&= ECHO不正确,它将清除除ECHO之外的所有位,应为new.c_lflag | = ECHO

– RedSoft
18 Mar 10 '18在2:43

#2 楼

#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

评论


@ mr-32,这完全是Linux,等效于Visual Studio用于Windows的getch(),减去此函数最后一行的printf()

–mf_
13年5月4日在12:10

#3 楼

我建议您使用curses.h或ncurses.h来实现包括getch()在内的键盘管理例程。您可以通过多种方法来更改getch的行为(即是否等待按键)。

#4 楼

ncurses库中有一个getch()函数。
您可以通过安装ncurses-dev软件包来获取它。

评论


在一种情况下,我不想为此安装新东西..任何其他选择吗?

–Jeegar Patel
2011年9月19日上午10:21

#5 楼

您可以按照其他答案中所述在Linux中使用curses.h库。
您可以通过以下方式在Ubuntu中安装它:

sudo apt-get update

我从这里开始安装。

#6 楼

如上所述,getch()ncurses库中。 ncurses必须初始化,请参见getchar()为此上,下箭头键返回相同的值(27)