Что эквивалентно 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.

Другие вопросы по тегам