Comment implémenter la fonction getch () de C dans Linux?

Dans TurboC ++, je peux utiliser la fonction getch() de conio.h . Mais sous Linux, gcc ne fournit pas conio.h . Comment puis-je obtenir les fonctionnalités de getch() ?

Essayez ce fichier conio.h :

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

Vous pouvez également utiliser la bibliothèque ncurses dans gcc pour certaines fonctions similaires à conio.h .

Si l’écho à l’écran n’est pas un problème, vous pouvez essayer d’utiliser getchar() partir de stdio.h .

getch() semble être inclus dans la bibliothèque curses .

Sous Unix, getch() fait partie de la bibliothèque ncurses. Mais j’ai écrit une solution de contournement à cette question qui vous permet d’utiliser une fonctionnalité de type getch sans le rest du bagage curses.

Selon ce code de solution , vous devez utiliser manuellement le code source ouvert pour les fonctions getch () et getche (), comme décrit ci-après.

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

Il suffit de le mettre avant votre principale méthode de code

conio.h est seulement dans Dos,

pour linux, utilisez

 sudo apt-get install libncurses-dev 

& puis

 -lncurses 

// Dans IDE, vous devez le lier: par exemple: codeblocks, Setting -> Comstackr -> Linker setting, et append ‘ncurses’

getch() est dans libcurses . l’utilisation de curses est un peu plus complexe car il a des liens profonds avec le terminal sous-jacent et doit être initialisé. un exemple de travail pour curses getch() avec l’initialisation de libcurses se trouve dans getchar () renvoie la même valeur (27) pour les touches fléchées haut et bas

Vous pouvez utiliser getch() équivalent de libcaca :

 __extern int caca_conio_getch (void) 

Si, pour une raison quelconque, vous ne pouvez pas utiliser de malédictions, essayez ceci:

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