Что эквивалентно getch() и getche() в Linux?
Я не могу найти эквивалентный заголовочный файл для conio.h в Linux.
Есть ли вариант для getch()
& getche()
функционировать в Linux?
Я хочу создать базовое меню для случая переключения, где пользователь предоставит свой вариант, просто нажав одну клавишу, и процесс должен быть продвинут. Я не хочу позволять пользователю нажимать клавишу ВВОД после выбора.
7 ответов
#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 */
if (echo) {
new.c_lflag |= ECHO; /* set echo mode */
} else {
new.c_lflag &= ~ECHO; /* set no 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);
}
/* 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;
}
Просто скопируйте эти функции и используйте их. Я нашел этот фрагмент в Google задолго до этого и сохранил его. Наконец-то я открыл его через долгое время для вас! Надеюсь, это поможет! Спасибо
char getch(){
/*#include <unistd.h> //_getch*/
/*#include <termios.h> //_getch*/
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 dont want the char to be displayed
Я предлагаю вам использовать curses.h или ncurses.h, которые реализуют процедуры управления клавиатурой, включая getch(). У вас есть несколько вариантов, чтобы изменить поведение getch (например, ждать нажатия клавиши или нет).
В библиотеке ncurses есть функция getch (). Вы можете получить его, установив пакет ncurses-dev.
Вы можете использовать curses.h
библиотека в Linux, как упоминалось в другом ответе.
Вы можете установить его в Ubuntu:
sudo apt-get update
sudo apt-get установить ncurses-dev
Я взял часть установки отсюда.
Как сказано выше getch()
находится в ncurses
библиотека. ncurses должен быть инициализирован, см. то есть getchar() возвращает одинаковое значение (27) для клавиш со стрелками вверх и вниз для этого
Я застрял в Mac для использования getch(), так как я хотел остановить экран при определенном условии, поэтому вот как я это понял:
#include <stdlib.h>
int main()
{
system( "read -n 1 -s -p \"Press any key to continue...\"" );
return 0;
}
Замена для getch()
является getchar()
объявлено в stdio.h
, getchar()
доступно в Windows и Linux.