What is the equivalent to getch() & getche() in Linux?
#include <termios.h>#include <stdio.h>static struct termios old, current;/* Initialize new terminal i/o settings */void initTermios(int echo) { tcgetattr(0, &old); /* grab old terminal i/o settings */ current = old; /* make new settings same as old settings */ current.c_lflag &= ~ICANON; /* disable buffered i/o */ if (echo) { current.c_lflag |= ECHO; /* set echo mode */ } else { current.c_lflag &= ~ECHO; /* set no echo mode */ } tcsetattr(0, TCSANOW, ¤t); /* 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);}/* Let's test it out */int main(void) { char c; printf("(getche example) please type a letter: "); c = getche(); printf("\nYou typed: %c\n", c); printf("(getch example) please type a letter..."); c = getch(); printf("\nYou typed: %c\n", c); return 0;}
Output:
(getche example) please type a letter: gYou typed: g(getch example) please type a letter...You typed: g
#include <unistd.h>#include <termios.h>char getch(void){ char buf = 0; struct termios old = {0}; fflush(stdout); if(tcgetattr(0, &old) < 0) perror("tcsetattr()"); old.c_lflag &= ~ICANON; old.c_lflag &= ~ECHO; old.c_cc[VMIN] = 1; old.c_cc[VTIME] = 0; if(tcsetattr(0, TCSANOW, &old) < 0) perror("tcsetattr ICANON"); if(read(0, &buf, 1) < 0) perror("read()"); old.c_lflag |= ICANON; old.c_lflag |= ECHO; if(tcsetattr(0, TCSADRAIN, &old) < 0) perror("tcsetattr ~ICANON"); printf("%c\n", buf); return buf; }
Remove the last printf
if you don't want the character to be displayed.