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

时间:2011-09-19 09:55:45

标签: c linux getchar getch getc

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

getch()&是否有任何选项? Linux中的getche()函数?

我想制作一个开关盒基本菜单,用户只需按一个键即可给出他的选项。过程应该向前推进。我不想让用户在按下他的选择后按ENTER键。

7 个答案:

答案 0 :(得分:67)

#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上找到了这个片段而且我已经保存了它,最后我在很长一段时间后为你打开它!希望它有所帮助!感谢

答案 1 :(得分: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

答案 2 :(得分:7)

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

答案 3 :(得分:4)

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

答案 4 :(得分:0)

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

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

  

sudo apt-get update

     

sudo apt-get install ncurses-dev

我从here获取了安装部分。

答案 5 :(得分:0)

如上所述,getch()位于ncurses库中。 ncurses必须初始化,请参阅getchar() returns the same value (27) for up and down arrow keys了解

答案 6 :(得分:-1)

getch()中的getchar()替代stdio.hgetchar()可在Windows和Linux上使用。

以下内容来自Max Truxa的评论。

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

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

如果这两个差异对用户不重要,可以使用getchar()作为替代,否则这可能不是最佳选择。