如何在Linux中实现C的getch()函数?

时间:2010-07-18 17:40:18

标签: c gcc getch conio

在TurboC ++中,我可以使用getch()中的conio.h函数。但在Linux中,gcc不提供conio.h。如何获得getch()的功能?

11 个答案:

答案 0 :(得分:27)

试试这个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;
}

您还可以使用gcc中的ncurses库来执行与conio.h类似的某些功能。

答案 1 :(得分:7)

答案 2 :(得分:6)

如果回显到屏幕不是问题,您可以尝试使用getchar()中的stdio.h

答案 3 :(得分:1)

getch()似乎包含在curses library中。

答案 4 :(得分:0)

在Unix中,getch()是ncurses库的一部分。但我为this question写了一个解决方法,让你可以使用类似getch的功能,而不需要其他的诅咒行李。

答案 5 :(得分:0)

根据这些解决方案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);
}

只需将它放在主要的代码方法

之前

答案 6 :(得分:0)

conio.h仅在Dos中,

for linux,使用

sudo apt-get install libncurses-dev

&安培;那么

-lncurses

//在IDE中,您必须链接它: 例如:codeblocks,Setting - &gt;编译器 - &gt;链接器设置,并添加&#39; ncurses&#39;

答案 7 :(得分:0)

getch()位于libcurses。使用curses有点复杂,因为它与底层终端有很深的链接,必须进行初始化。初始化为libcurses的curses getch()的工作示例位于getchar() returns the same value (27) for up and down arrow keys

答案 8 :(得分:0)

您可以使用libcaca中的"AccountTester a = new Account();" 等效内容:

getch()

答案 9 :(得分:0)

如果出于任何原因您不能使用诅咒,请尝试以下操作:

# 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);
}

答案 10 :(得分:0)

你也可以像这样在linux中使用system命令来控制终端

char getch()    {

        char c;

        system("stty raw -echo");

        c = getchar();

        system("stty -raw echo");

        return c;

}

此功能不需要用户按回车键,并且无需回显即可从用户那里获取输入它需要您将 stdlib.h 库添加到您的代码中

注意:此功能仅适用于基于 UNIX 的操作系统

任何改进或指出代码中的任何问题将不胜感激

问候