在 TurboC++ 中,我可以getch()
使用conio.h
. 但在 Linux 中,gcc 不提供conio.h
. 我怎样才能获得的功能getch()
?
11 回答
试试这个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
.
如果回显到屏幕不是问题,您可以尝试使用getchar()
from stdio.h
。
getch()
似乎包含在curses library中。
您可以使用libcacagetch()
中的等效项:
__extern int caca_conio_getch (void)
根据这些解决方案代码,您必须手动使用 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);
}
只需将它放在您的主要代码方法之前
如果由于任何原因您不能使用诅咒,请尝试以下操作:
# 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);
}
在 Unix 中,getch()
是 ncurses 库的一部分。但是我为这个问题写了一个解决方法,它可以让你使用类似 getch 的功能,而没有其他的诅咒包袱。
conio.h 仅在 Dos 中,
对于 Linux,使用
sudo apt-get install libncurses-dev
& 然后
-lncurses
// 在 IDE 中,你必须链接它:例如:代码块,设置 -> 编译器 -> 链接器设置,并添加 'ncurses'
你也可以像这样使用系统命令来控制linux中的终端
char getch() {
char c;
system("stty raw -echo");
c = getchar();
system("stty -raw echo");
return c;
}
此功能不需要用户按 Enter 并从用户那里获取输入而不回显它需要您将 stdlib.h 库添加到您的代码中
注意:此功能仅适用于基于 UNIX 的操作系统
任何改进或指出代码中的任何问题将不胜感激
问候
getch()
在libcurses
. curses 的使用有点复杂,因为它与底层终端有很深的链接并且必须被初始化。getch()
带有 libcurses 初始化的curses 的一个工作示例在getchar() 中为向上和向下箭头键返回相同的值 (27)