2010-07-18 19 views
14

In TurboC++, posso utilizzare la funzione getch() da conio.h. Ma in Linux, gcc non fornisce conio.h. Come posso ottenere la funzionalità di getch()?Come implementare la funzione getch() di C in Linux?

+4

turbo c è dead.Don't usarlo. –

+0

Possibile duplicato di [Linux Equivalent per conio.h getch()] (https://stackoverflow.com/questions/34474627/linux-equivalent-for-conio-h-getch) –

risposta

6

Se l'eco dello schermo non è un problema, provare a utilizzare getchar() da stdio.h.

+5

Echoing sullo schermo non è l'unica differenza tra 'getch()' e 'getchar()'. 'getch()' non attende il ritorno a capo prima di essere letto dal buffer. Per esempio. per inserire 'a' usando 'getchar()', devi digitare 'a [ENTER]'. Con 'getch()', è sufficiente digitare 'a'. –

0

In Unix, getch() fa parte della libreria ncurses. Ma ho scritto una soluzione alternativa per this question che consente di utilizzare la funzionalità di tipo getch senza il resto del bagaglio di curses.

24

Prova questo file conio.h:

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

È inoltre possibile utilizzare la libreria ncurses a gcc per alcune funzioni simili a conio.h.

+0

Grazie. Molto utile! –

0

Secondo questa soluzione code è necessario utilizzare manualmente il codice open source per la funzione getch() e getche() come descritto, il codice è il seguente.

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

Basta metterlo prima del tuo principale metodo di codice

0

conio.h è solo in Dos,

per Linux, usare

sudo apt-get install libncurses-dev 

& poi

-lncurses 

// In IDE, è necessario collegarlo: per esempio: codeblocks, Impostazione - Impostazione Linker>, e aggiunge 'ncurses'

0

È possibile utilizzare getch() equivalente da libcaca:

__extern int caca_conio_getch (void)