web-dev-qa-db-fra.com

Qu'est-ce qui est équivalent à getch () et getche () sous Linux?

Je ne parviens pas à trouver un fichier d'en-tête équivalent pour conio.h sous Linux.

Existe-t-il une option pour la fonction getch() & getche() sous Linux?

Je veux faire un menu de base de cas de commutateur où l'utilisateur donnera son option simplement en appuyant sur une touche et le processus devrait être avancé. Je ne veux pas laisser l'utilisateur appuyer sur ENTER après avoir appuyé sur son choix.

49
Jeegar Patel
#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 */
  if (echo) {
      new.c_lflag |= ECHO; /* set echo mode */
  } else {
      new.c_lflag &= ~ECHO; /* set no 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);
}

/* Let's test it out */
int main(void) {
  char c;
  printf("(getche example) please type a letter: ");
  c = getche();
  printf("\nYou typed: %c\n", c);
  printf("(getch example) please type a letter...");
  c = getch();
  printf("\nYou typed: %c\n", c);
  return 0;
} 

Copiez simplement ces fonctions et utilisez-les. J'ai trouvé cet extrait sur Google longtemps avant et je l'ai sauvegardé. Enfin, je l'ai ouvert après un long moment pour vous! Merci

69
niko
char getch(){
    /*#include <unistd.h>   //_getch*/
    /*#include <termios.h>  //_getch*/
    char buf=0;
    struct termios old={0};
    fflush(stdout);
    if(tcgetattr(0, &old)<0)
        perror("tcsetattr()");
    old.c_lflag&=~ICANON;
    old.c_lflag&=~ECHO;
    old.c_cc[VMIN]=1;
    old.c_cc[VTIME]=0;
    if(tcsetattr(0, TCSANOW, &old)<0)
        perror("tcsetattr ICANON");
    if(read(0,&buf,1)<0)
        perror("read()");
    old.c_lflag|=ICANON;
    old.c_lflag|=ECHO;
    if(tcsetattr(0, TCSADRAIN, &old)<0)
        perror ("tcsetattr ~ICANON");
    printf("%c\n",buf);
    return buf;
 }

copier cette fonction et l'utiliser, n'oubliez pas l'inclus

remove the last printf if you dont want the char to be displayed

29
mf_

Je vous suggère d'utiliser curses.h ou ncurses.h, qui implémentent des routines de gestion du clavier, y compris getch (). Vous avez plusieurs options pour changer le comportement de getch (attendre une pression sur une touche ou non).

7
Fafaman

Il existe une fonction getch () dans la bibliothèque ncurses. Vous pouvez l'obtenir en installant le paquet ncurses-dev.

4
Jan S

Comme indiqué ci-dessus, getch() se trouve dans la bibliothèque ncurses. ncurses doit être initialisé, voir i.e. getchar () renvoie la même valeur (27) pour les touches fléchées haut et bas pour cela

0
ralf htp

Vous pouvez utiliser la bibliothèque curses.h sous Linux comme indiqué dans l'autre réponse.

Vous pouvez l'installer dans Ubuntu par:

Sudo apt-get update

Sudo apt-get installez ncurses-dev

J'ai pris la partie installation de ici .

0
Ashish Ahuja