En TurboC++, je peux utiliser la fonction getch()
de conio.h
. Mais sous Linux, gcc ne fournit pas conio.h
. Comment puis-je obtenir la fonctionnalité de getch()
?
Essayez ce fichier 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;
}
Vous pouvez également utiliser la bibliothèque ncurses dans gcc pour certaines fonctions similaires à conio.h
.
Découvrez les malédictions:
http://en.wikipedia.org/wiki/Curses_%28programming_library%29
Si l'écho à l'écran ne pose pas de problème, vous pouvez essayer d'utiliser getchar()
de stdio.h
.
getch()
semble être inclus dans bibliothèque de curses .
Vous pouvez utiliser l'équivalent getch()
de libcaca :
__extern int caca_conio_getch (void)
conio.h est seulement dans Dos,
pour linux, utilisez
Sudo apt-get install libncurses-dev
& puis
-lncurses
// Dans IDE, vous devez le lier: Par exemple: codeblocks, Setting -> Compiler -> Linker setting et ajouter 'ncurses'
getch()
est dans libcurses
. l'utilisation de curses est un peu plus complexe car il a des liens profonds avec le terminal sous-jacent et doit être initialisé. un exemple de travail pour curses getch()
avec initialisation de libcurses se trouve dans getchar () renvoie la même valeur (27) pour les flèches haut et bas
Sous Unix, getch()
fait partie de la bibliothèque ncurses. Mais j’ai écrit une solution de contournement pour cette question qui vous permet d’utiliser une fonctionnalité de type getch sans le reste des bagages.
Selon ces solutions code , vous devez utiliser manuellement le code source ouvert pour les fonctions getch () et getche () telles que décrites, le code est le suivant.
#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);
}
Il suffit de le mettre avant votre principale méthode de code
Si, pour une raison quelconque, vous ne pouvez pas utiliser de sorts, essayez ceci:
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <ctype.h>
# include <termios.h>
/* get a single char from stdin */
int getch(void)
{
struct termios oldattr, newattr;
int ch;
tcgetattr(0, &oldattr);
newattr=oldattr;
newattr.c_lflag &= ~( ICANON | ECHO );
tcsetattr( 0, TCSANOW, &newattr);
ch=getchar();
tcsetattr(0, TCSANOW, &oldattr);
return(ch);
}