85 votes

Quel est l'équivalent de getch() et getche() sous Linux ?

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

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

Je souhaite créer un menu de base de cas de commutation où l'utilisateur donnera son option en appuyant simplement 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.

99voto

niko Points 3622
#include <termios.h>
#include <stdio.h>

static struct termios old, current;

/* Initialize new terminal i/o settings */
void initTermios(int echo) 
{
  tcgetattr(0, &old); /* grab old terminal i/o settings */
  current = old; /* make new settings same as old settings */
  current.c_lflag &= ~ICANON; /* disable buffered i/o */
  if (echo) {
      current.c_lflag |= ECHO; /* set echo mode */
  } else {
      current.c_lflag &= ~ECHO; /* set no echo mode */
  }
  tcsetattr(0, TCSANOW, &current); /* 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;
}

Sortir:

 (getche example) please type a letter: g
You typed: g
(getch example) please type a letter...
You typed: g

44voto

mf_ Points 575
#include <unistd.h>
#include <termios.h>

char getch(void)
{
    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;
 }

Supprimez le dernier printf si vous ne voulez pas que le caractère soit affiché.

7voto

Fafaman Points 141

Je vous suggère d'utiliser curses.h ou ncurses.h pour implémenter des routines de gestion de clavier, y compris getch(). Vous avez plusieurs options pour modifier le comportement de getch (c'est-à-dire attendre ou non la pression d'une touche).

4voto

Jan S Points 1396

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

-1voto

fortunate_man Points 3713

Vous pouvez utiliser la curses.h sous Linux comme mentionné dans l'autre réponse.

Vous pouvez l'installer dans Ubuntu en :

sudo apt-get mise à jour

sudo apt-get install ncurses-dev

J'ai pris la partie installation à partir d' ici .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X