web-dev-qa-db-fra.com

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

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

16
Hits

Essayez ce fichier 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;
}

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

27
Shobhit
7
Jamie Wong

Si l'écho à l'écran ne pose pas de problème, vous pouvez essayer d'utiliser getchar() de stdio.h.

6
Carl Smotricz

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

1
che

Vous pouvez utiliser l'équivalent getch() de libcaca :

__extern int caca_conio_getch (void)
0
Sauron

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 -> Compiler -> Linker setting et ajouter 'ncurses'

0
THEOS

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 initialisation de libcurses se trouve dans getchar () renvoie la même valeur (27) pour les flèches haut et bas

0
ralf htp

Sous 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 une fonctionnalité de type getch sans le reste des bagages.

0
luser droog

Selon ces solutions code , vous devez utiliser manuellement le code source ouvert pour les fonctions getch () et getche () telles que décrites, le code est le suivant.

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

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

0
Shubham Sharma

Si, pour une raison quelconque, vous ne pouvez pas utiliser de sorts, essayez ceci:

# 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
piper