GNU/Linux >> Tutoriels Linux >  >> Linux

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

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

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


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


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 modifier le comportement de getch (c'est-à-dire attendre ou non la pression d'une touche).


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

Sortie :

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

Linux
  1. Quel est le but du fichier .bashrc sous Linux

  2. Quel est l'équivalent C++ d'AutoResetEvent sous Linux ?

  3. Quel est l'équivalent Unix/Linux des E/S enregistrées ?

  4. Quel est l'équivalent de la commande updatedb de Linux pour Mac ?

  5. Quel est l'équivalent de la commande Linux File pour Windows ?

Linux vs Unix :Quelle est la différence ?

Qu'est-ce que la commande Linux Watch + Exemples

Qu'est-ce que le Shell sous Linux ?

Quel est le niveau d'exécution actuel du système Linux ?

Qu'est-ce que la commande kill sous Linux ?

Quel est l'équivalent FreeBSD de Linux update-rc.d ?