Linux中的getch()和getche()相当于什么?

问题描述 投票:52回答:7

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

在Linux中有getch()getche()函数的选项吗?

我想制作一个开关盒基本菜单,用户只需按一个键就可以选择,并且应该向前移动过程。按下他的选择后,我不想让用户按ENTER键。

c linux getchar getch getc
7个回答
68
投票
#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 */
  if (echo) {
      new.c_lflag |= ECHO; /* set echo mode */
  } else {
      new.c_lflag &= ~ECHO; /* set no 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);
}

/* 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;
} 

只需复制这些功能并使用它。我很久以前在google上找到了这个片段而且我已经保存了它,最后我在很长一段时间后为你打开它!希望它有所帮助!谢谢


30
投票
char getch(){
    /*#include <unistd.h>   //_getch*/
    /*#include <termios.h>  //_getch*/
    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;
 }

复制此功能并使用它,不要忘记包含

remove the last printf if you dont want the char to be displayed


7
投票

我建议你使用curses.h或ncurses.h这些实现键盘管理例程,包括getch()。您有几个选项可以更改getch的行为(即等待是否按键)。


4
投票

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


0
投票

您可以在linux中使用curses.h库,如其他答案中所述。

您可以通过以下方式在Ubuntu中安装它:

sudo apt-get update

sudo apt-get install ncurses-dev

我从here那里购买了安装部件。


0
投票

如上所述,getch()位于ncurses图书馆。 ncurses必须初始化,请参见getchar() returns the same value (27) for up and down arrow keys


-1
投票

getch()的替代品是在getchar()宣布的stdio.hgetchar()可在Windows和Linux上使用。

以下是来自Max Truxa的评论。

getch()getchar()之间存在一些(有些重要的)差异。

1)一旦按下一个键,getch()立即返回。 getchar()允许您无限期地输入,直到您输入EOL。 2)getch()不会在屏幕上打印任何内容。 getchar()将您键入的所有内容写入屏幕(甚至是EOL)。

如果这两个差异对用户不重要,可以真正使用getchar()作为替代,否则这可能不是最好的主意。

© www.soinside.com 2019 - 2024. All rights reserved.