Как реализовать функцию getch() C в Linux?
В TurboC++ я могу использовать getch()
функция от conio.h
, Но в Linux gcc не предоставляет conio.h
, Как я могу получить функциональность getch()
?
12 ответов
Попробуй это 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;
}
Вы также можете использовать библиотеку ncurses в gcc для некоторых функций, подобных conio.h
,
Если отображение на экране не является проблемой, вы можете попробовать использовать getchar()
от stdio.h
,
Проверьте проклятия:
http://en.wikipedia.org/wiki/Curses_%28programming_library%29
Ты можешь использовать getch()
эквивалент из libcaca:
__extern int caca_conio_getch (void)
Если по каким-либо причинам вы не можете использовать проклятия, попробуйте это:
# 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);
}
В соответствии с этим кодом решения вы должны вручную использовать открытый исходный код для функций getch() и getche(), как описано в следующем коде.
#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);
}
Просто поместите это перед вашим основным методом кода
conio.h только в Дос,
для Linux используйте
sudo apt-get install libncurses-dev
& затем
-lncurses
// В IDE вы должны связать его: например: кодовые блоки, Настройка -> Компилятор -> Настройка компоновщика и добавить 'ncurses'
getch()
в libcurses
, Использование curses немного сложнее, потому что оно имеет глубокие связи с нижележащим терминалом и должно быть инициализировано. рабочий пример для проклятий getch()
при инициализации libcurses находится в getchar() возвращает одинаковое значение (27) для клавиш со стрелками вверх и вниз
В Unix getch()
является частью библиотеки ncurses. Но я написал обходной путь для этого вопроса, который позволяет вам использовать функциональность, подобную getch, без остатка проклятого багажа.
Вы также можете использовать системную команду для управления терминалом в Linux, например
char getch() {
char c;
system("stty raw -echo");
c = getchar();
system("stty -raw echo");
return c;
}
Эта функция не требует, чтобы пользователь нажимал клавишу ввода, и принимает ввод от пользователя без повторения. Она требует, чтобы вы добавили библиотеку stdlib.h в свой код.
Примечание: эта функция применима только к ОС на базе UNIX.
Мы будем благодарны за любые улучшения или указание на какие-либо проблемы в коде.
С Уважением
Если вы хотите использовать
conio.h
в Ubuntu, затем выполните следующие действия:
- Открытый терминал
-
sudo apt-get install git
-
git clone https://github.com/zoelabbb/conio.h.git
-
cd conio.h
-
sudo mv conio.h /usr/include/
- Закройте IDE и снова откройте. Сделанный.
Если у вас возникли проблемы, перейдите по этой ссылке: введите описание ссылки здесь