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() ?

15
demandé sur MD XF 2010-07-18 21:40:17

10 réponses

Essayez cette conio.h fichier:

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

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

25
répondu Shobhit 2017-03-01 05:15:44
7
répondu Jamie Wong 2010-07-18 17:43:30

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

6
répondu Carl Smotricz 2010-07-18 17:44:43

getch() semble être inclus dans bibliothèque des malédictions .

1
répondu che 2010-07-18 17:44:14

En Unix, getch() fait partie de la bibliothèque ncurses. Mais j'ai écrit une solution de contournement pour cette question qui vous permet d'utiliser la fonctionnalité getch-like sans le reste des malédictions bagages.

0
répondu luser droog 2017-05-23 10:31:37

selon cette solution code vous devez utiliser manuellement le code source ouvert pour la fonction getch() et getche() comme décrit le code est comme suit .

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

mettez-le juste avant votre méthode principale de code

0
répondu Shubham Sharma 2017-05-23 11:55:13

conio.h est uniquement dans le Dos,

pour linux, utiliser

sudo apt-get install libncurses-dev

et puis

-lncurses

// En IDE, vous avez un lien: par exemple: codeblocks, Setting - > Compiler - > Linker setting, et add 'ncurses'

0
répondu THEOS 2016-10-22 21:21:38

getch() est dans libcurses . l'utilisation de malédictions est un peu plus complexe car elle a des liens profonds avec le terminal sous-jacent et doit être initialisée. un exemple de travail pour les malédictions getch() avec l'initialisation des libcurses est dans getchar () retourne la même valeur (27) pour les flèches haut et bas

0
répondu ralf htp 2017-09-07 13:55:57

vous pouvez utiliser getch() équivalent de libcaca :

__extern int caca_conio_getch (void)
0
répondu Sauron 2018-02-20 04:33:12

Si, pour une raison quelconque, vous ne pouvez pas utiliser les malédictions, essayez ce qui suit:

# 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);
}
0
répondu piper 2018-06-20 00:24:19