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?
risposta
Partenza maledizioni:
http://en.wikipedia.org/wiki/Curses_%28programming_library%29
getch()
sembra essere inclusi in curses library.
Se l'eco dello schermo non è un problema, provare a utilizzare getchar()
da stdio.h
.
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'. –
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.
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
.
Grazie. Molto utile! –
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
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'
getch()
è in libcurses
-> Compiler. l'uso di curses è un po 'più complesso perché ha collegamenti profondi al terminale sottostante e deve essere inizializzato. un esempio di lavoro per curses getch()
con inizializzazione di libcurses è in getchar() returns the same value (27) for up and down arrow keys
È possibile utilizzare getch()
equivalente da libcaca:
__extern int caca_conio_getch (void)
turbo c è dead.Don't usarlo. –
Possibile duplicato di [Linux Equivalent per conio.h getch()] (https://stackoverflow.com/questions/34474627/linux-equivalent-for-conio-h-getch) –