2010-07-18 16 views
14

In TurboC++ kann ich die getch() Funktion von conio.h verwenden. Unter Linux stellt gcc conio.h jedoch nicht zur Verfügung. Wie kann ich die Funktionalität von getch() bekommen?Wie implementiert man getch() - Funktion von C in Linux?

+4

turbo c ist dead.Don't sie verwenden. –

+0

Mögliches Duplikat von [Linux Equivalent für conio.h getch()] (https://stackoverflow.com/questions/34474627/linux-equivalent-for-conio-h-getch) –

Antwort

6

Wenn das Echo auf dem Bildschirm kein Problem ist, können Sie versuchen, getchar() von stdio.h zu verwenden.

+5

Echo auf den Bildschirm ist nicht der einzige Unterschied zwischen 'getch()' und 'getchar()'. 'getch()' wartet nicht auf eine Zeilenschaltung, bevor es aus dem Puffer liest. Z.B. Um 'a' mit 'getchar()' einzugeben, müssen Sie 'a [ENTER]' eingeben. Mit 'getch()' brauchst du nur 'a'. –

0

In Unix ist getch() Teil der Ncurses-Bibliothek. Aber ich habe einen Workaround für this question geschrieben, mit dem Sie getch-ähnliche Funktionen ohne den Rest des Fluchgepäcks nutzen können.

24

Versuchen Sie, diese conio.h Datei:

#include <termios.h> 
#include <unistd.h> 
#include <stdio.h> 

/* reads from keypress, doesn't echo */ 
int getch(void) 
{ 
    struct termios oldattr, newattr; 
    int ch; 
    tcgetattr(STDIN_FILENO, &oldattr); 
    newattr = oldattr; 
    newattr.c_lflag &= ~(ICANON | ECHO); 
    tcsetattr(STDIN_FILENO, TCSANOW, &newattr); 
    ch = getchar(); 
    tcsetattr(STDIN_FILENO, TCSANOW, &oldattr); 
    return ch; 
} 

/* reads from keypress, echoes */ 
int getche(void) 
{ 
    struct termios oldattr, newattr; 
    int ch; 
    tcgetattr(STDIN_FILENO, &oldattr); 
    newattr = oldattr; 
    newattr.c_lflag &= ~(ICANON); 
    tcsetattr(STDIN_FILENO, TCSANOW, &newattr); 
    ch = getchar(); 
    tcsetattr(STDIN_FILENO, TCSANOW, &oldattr); 
    return ch; 
} 

Sie auch die ncurses Bibliothek in gcc für einige Funktionen ähnlich wie conio.h verwenden können.

+0

Danke. Sehr hilfreich! –

0

Nach dieser Lösung code müssen Sie Open Source-Code für getch() und getche() -Funktion manuell verwenden, wie beschrieben der Code wie folgt ist.

#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 */ 
    new.c_lflag &= echo ? ECHO : ~ECHO; /* set 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); 
} 

Setzen Sie ihn einfach vor Ihrem Hauptverfahren Code

0

conio.h ist nur in Dos,

für Linux verwenden

sudo apt-get install libncurses-dev 

& dann

-lncurses 

// In IDE, müssen Sie es verlinken: zum Beispiel: Codeblöcke, Einstellung -> Compiler -> Linker Einstellung und fügen 'ncurses'

0

Sie äquivalente getch() von libcaca verwenden:

__extern int caca_conio_getch (void) 
Verwandte Themen