GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was ist das Äquivalent zu getch() &getche() in 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;
 }

Entfernen Sie das letzte printf wenn Sie nicht möchten, dass das Zeichen angezeigt wird.


Es gibt eine getch()-Funktion in der ncurses-Bibliothek. Sie erhalten sie, indem Sie das ncurses-dev-Paket installieren.


Ich schlage vor, Sie verwenden curses.h oder ncurses.h, diese implementieren Tastaturverwaltungsroutinen einschließlich getch(). Sie haben mehrere Möglichkeiten, das Verhalten von getch zu ändern (z. B. auf Tastendruck warten oder nicht).


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

Ausgabe:

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

Linux
  1. Was ist das Linux-Äquivalent zur DOS-Pause?

  2. Was ist das Unix/Linux-Äquivalent von Registered I/O?

  3. Was ist das Äquivalent von Linux's updatedb-Befehl für den Mac?

  4. Was ist das Äquivalent zum Linux-Dateibefehl für Windows?

  5. Was ist das Äquivalent von Linux's ~ (Tilde) in Windows?

Was ist der Linux-Überwachungsbefehl + Beispiele

Was ist die Shell unter Linux?

Was ist der Kill-Befehl in Linux?

Was wäre das Äquivalent der Win32-API in Linux?

Was ist das Äquivalent von Active Directory unter Linux

Was ist das FreeBSD-Äquivalent von Linux update-rc.d?