В TurboC++ я могу использовать функцию getch()
из conio.h
. Но в Linux gcc не предоставляет conio.h
. Как я могу получить функциональность getch()
?
Как реализовать функцию getch() C в Linux?
Ответы (11)
Попробуйте этот 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
.
ICANON
? Каков его эффект?
- person domsson; 18.11.2020
Если эхо на экран не проблема, вы можете попробовать использовать getchar()
из stdio.h
.
getch()
и getchar()
. getch()
не ждет возврата каретки перед чтением из буфера. Например. чтобы ввести «а» с помощью getchar()
, вы должны ввести a[ENTER]
. С getch()
вам нужен только тип «a».
- person Jamie Wong; 18.07.2010
Проверьте проклятия:
http://en.wikipedia.org/wiki/Curses_%28programming_library%29
getch()
.
- person caf; 19.07.2010
conio.h
, то вы, вероятно, используете и другие. И если вы портируете приложение, которое активно использует conio.h
, curses, вероятно, лучший выбор. Я думаю, что отрицательный ответ больше похож на ответ, выглядящий только по ссылке.
- person Damian Yerrick; 18.11.2015
В соответствии с этим решением code вы должны вручную использовать открытый исходный код для функций 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);
}
Просто поместите его перед основным методом кода
Если по каким-либо причинам вы не можете использовать проклятия, попробуйте следующее:
# 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);
}
В Unix getch()
является частью библиотеки ncurses. Но я написал обходной путь для этого вопроса, который позволяет вам использовать getch- нравится функциональность без остального багажа проклятий.
conio.h есть только в Досе,
для линукса используйте
sudo apt-get install libncurses-dev
& тогда
-lncurses
// В IDE вы должны связать это: например: codeblocks, Setting -> Compiler -> Linker settings и добавить 'ncurses'
getch()
находится в libcurses
. использование curses немного сложнее, потому что они имеют глубокие ссылки на нижележащий терминал и должны быть инициализированы. рабочий пример для curses getch()
с инициализацией libcurses находится в getchar() возвращает одно и то же значение (27) для клавиш со стрелками вверх и вниз
Вы можете использовать getch()
эквивалент из libcaca:
__extern int caca_conio_getch (void)
Вы также можете использовать системную команду для управления терминалом в Linux, как это
char getch() {
char c;
system("stty raw -echo");
c = getchar();
system("stty -raw echo");
return c;
}
Эта функция не требует, чтобы пользователь нажимал ввод, и принимает ввод от пользователя без эха. Требуется добавить библиотеку stdlib.h в ваш код.
Примечание. Эта функция применима только к ОС на базе UNIX.
Любые улучшения или указание на какие-либо проблемы в коде будут оценены
С Уважением