22

在 TurboC++ 中,我可以getch()使用conio.h. 但在 Linux 中,gcc 不提供conio.h. 我怎样才能获得的功能getch()

4

11 回答 11

33

试试这个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.

于 2014-04-12T19:24:05.493 回答
7

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

于 2010-07-18T17:44:43.473 回答
6

查看诅咒:

http://en.wikipedia.org/wiki/Curses_%28programming_library%29

于 2010-07-18T17:43:30.543 回答
1

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

于 2010-07-18T17:44:14.407 回答
1

您可以使用libcacagetch()中的等效项:

__extern int caca_conio_getch (void)
于 2018-02-20T04:33:12.173 回答
1

根据这些解决方案代码,您必须手动使用 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);
}

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

于 2016-08-21T11:38:15.197 回答
1

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

# 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);
}
于 2018-06-20T00:24:19.830 回答
0

在 Unix 中,getch()是 ncurses 库的一部分。但是我为这个问题写了一个解决方法,它可以让你使用类似 getch 的功能,而没有其他的诅咒包袱。

于 2012-05-22T19:00:09.567 回答
0

conio.h 仅在 Dos 中,

对于 Linux,使用

sudo apt-get install libncurses-dev

& 然后

-lncurses

// 在 IDE 中,你必须链接它:例如:代码块,设置 -> 编译器 -> 链接器设置,并添加 'ncurses'

于 2016-10-22T21:21:38.383 回答
0

你也可以像这样使用系统命令来控制linux中的终端

char getch()    {

        char c;

        system("stty raw -echo");

        c = getchar();

        system("stty -raw echo");

        return c;

}

此功能不需要用户按 Enter 并从用户那里获取输入而不回显它需要您将 stdlib.h 库添加到您的代码中

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

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

问候

于 2021-04-30T01:17:42.423 回答
0

getch()libcurses. curses 的使用有点复杂,因为它与底层终端有很深的链接并且必须被初始化。getch()带有 libcurses 初始化的curses 的一个工作示例在getchar() 中为向上和向下箭头键返回相同的值 (27)

于 2017-09-07T13:55:57.807 回答