Was ist das Äquivalent zu getch() & getche() in Linux?

Lesezeit: 3 Minuten

Benutzeravatar von Jeegar Patel
Jeegar Patel

Ich kann die entsprechende Header-Datei für conio.h unter Linux nicht finden.

Gibt es eine Möglichkeit für getch() & getche() Funktion unter Linux?

Ich möchte ein Switch-Case-Basismenü erstellen, in dem der Benutzer seine Option einfach durch Drücken einer Taste angibt und der Prozess vorangetrieben werden sollte. Ich möchte nicht, dass der Benutzer die EINGABETASTE drückt, nachdem er seine Wahl getroffen hat.

Nikos Benutzeravatar
Niko

#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

  • Danke, es funktioniert, aber ich musste ersetzen Neu mit etwas anderem, weil es ein Schlüsselwort ist, denke ich

    – Mihai Vilcu

    4. Juni 2013 um 19:33 Uhr

  • @cipher Unter Windows haben Sie _getch in den Windows-APIs enthalten, in

    – Paul Stelian

    7. Januar 2017 um 21:01 Uhr

  • @MihaiVilcu new ist ein Schlüsselwort in C++, aber nicht in C.

    – Paul Stelian

    7. Januar 2017 um 21:01 Uhr

  • @PaulStelian Ich habe damals mingw-gcc verwendet, und wenn ich mich recht erinnere, hatte es kein conio oder termios.

    – Chiffre

    12. Januar 2017 um 16:24 Uhr

  • In diesem Beispiel gibt es einen Fehler: when echo is true new.c_lflag &= ECHO falsch ist, werden alle Bits außer ECHO gelöscht, sollte es sein new.c_lflag |= ECHO

    – RedSoft

    10. März 2018 um 2:43 Uhr

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

  • @mr-32 Dies ist genau das Linux-Äquivalent zu getch(), das von Visual Studio für Windows verwendet wird, abzüglich des printf() in der letzten Zeile dieser Funktion

    – mf_

    4. Mai 2013 um 12:10 Uhr

  • Ich hoffe, es ist nicht, weil es einen Fehler enthält. Es wird davon ausgegangen, dass ICANON und ECHO beim Zurücksetzen auf den alten Zustand vor dem Anruf gesetzt wurden.

    – pjcard

    14. Juni um 18:21 Uhr

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 (dh auf Tastendruck warten oder nicht).

Es gibt eine getch()-Funktion in der Ncurses-Bibliothek. Sie können es erhalten, indem Sie das Paket ncurses-dev installieren.

Box Box Box Benutzeravatar von Box
Kiste Kiste Kiste Kiste

Du kannst den … benutzen curses.h Bibliothek in Linux, wie in der anderen Antwort erwähnt.

Sie können es in Ubuntu installieren, indem Sie:

sudo apt-get update

sudo apt-get install ncurses-dev

Ich nahm den Installationsteil ab hier.

Benutzeravatar von ralf htp
Ralf Htp

Wie oben gesagt getch() ist in dem ncurses Bibliothek. ncurses muss sein initialisiertsiehe dh getchar() gibt dafür den gleichen Wert (27) für die Aufwärts- und Abwärtspfeiltasten zurück

1418470cookie-checkWas ist das Äquivalent zu getch() & getche() in Linux?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy