Comment implémenter la fonction getch () de C dans Linux?
10 réponses
Essayez cette conio.h
fichier:
#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 n'est pas un problème, vous pouvez essayer d'utiliser getchar()
de stdio.h
.
En 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 la fonctionnalité getch-like sans le reste des malédictions bagages.
selon cette solution code vous devez utiliser manuellement le code source ouvert pour la fonction getch() et getche() comme décrit le code est comme suit .
#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);
}
mettez-le juste avant votre méthode principale de code
conio.h est uniquement dans le Dos,
pour linux, utiliser
sudo apt-get install libncurses-dev
et puis
-lncurses
// En IDE, vous avez un lien: par exemple: codeblocks, Setting - > Compiler - > Linker setting, et add 'ncurses'
getch()
est dans libcurses
. l'utilisation de malédictions est un peu plus complexe car elle a des liens profonds avec le terminal sous-jacent et doit être initialisée. un exemple de travail pour les malédictions getch()
avec l'initialisation des libcurses est dans getchar () retourne la même valeur (27) pour les flèches haut et bas
Si, pour une raison quelconque, vous ne pouvez pas utiliser les malédictions, essayez ce qui suit:
# 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);
}