How to implement getch() function of C in Linux?
In TurboC++, I can use the getch()
function fr开发者_开发知识库om conio.h
. But in Linux, gcc doesn't provide conio.h
. How can I get the functionality of getch()
?
Try this conio.h
file:
#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;
}
You can also use the ncurses library in gcc for some functions similar to conio.h
.
If echoing to the screen is not a problem, you could try using getchar()
from stdio.h
.
Check out curses:
http://en.wikipedia.org/wiki/Curses_%28programming_library%29
getch()
seems to be included in curses library.
According to these solution code you must manually use open source code for getch() and getche() function as described the code is as following .
#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);
}
Just put it before your main method of code
You can use getch()
equivalent from libcaca:
__extern int caca_conio_getch (void)
If, for any reasons, you can't use curses, try this:
# 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);
}
In Unix, getch()
is part of the ncurses library. But I wrote a workaround for this question that lets you use getch-like functionality without the rest of the curses baggage.
conio.h is only in Dos,
for linux, use
sudo apt-get install libncurses-dev
& then
-lncurses
// In IDE, you have to link it: for example: codeblocks, Setting -> Compiler -> Linker setting, and add 'ncurses'
getch()
is in libcurses
. the use of curses is a bit more complex because it has deep links to the underlying terminal and has to be initialized. a working example for curses getch()
with initialization of libcurses is in getchar() returns the same value (27) for up and down arrow keys
You can also use system command to control the terminal in linux like this
char getch() {
char c;
system("stty raw -echo");
c = getchar();
system("stty -raw echo");
return c;
}
This function does not requires the user to press enter and takes input from the user without echoing It requires you to add stdlib.h library to your code
Note : This function is only applicable to UNIX-based OS
Any improvements or pointing out any issues in the code will be appreciated
Regards
If you want to use conio.h
on Ubuntu, then follow these steps:-
- Open terminal
sudo apt-get install git
git clone https://github.com/zoelabbb/conio.h.git
cd conio.h
sudo mv conio.h /usr/include/
- Close your IDE and open again. Done.
If you are in trouble then follow this link: enter link description here
精彩评论