Подтвердить что ты не робот

Что эквивалентно getch() и getche() в Linux?

Я не могу найти эквивалентный заголовочный файл для conio.h в Linux.

Есть ли опция для функции getch() и getche() в Linux?

Я хочу создать базовое меню для случая переключения, где пользователь предоставит свой вариант, просто нажав одну клавишу, и процесс должен быть продвинут. Я не хочу позволять пользователю нажимать клавишу ВВОД после выбора.

4b9b3361

Ответ 1

#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, &current); /* 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 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;
}

Выход:

(getche example) please type a letter: g
You typed: g
(getch example) please type a letter...
You typed: g

Ответ 2

#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;
 }

Удалите последний printf если вы не хотите, чтобы символ отображался.

Ответ 3

Я предлагаю вам использовать curses.h или ncurses.h, они реализуют процедуры управления клавиатурой, включая getch(). У вас есть несколько вариантов изменения поведения getch (т.е. Ждать нажатия клавиши или нет).

Ответ 4

В библиотеке ncurses есть функция getch(). Вы можете получить его, установив пакет ncurses-dev.

Ответ 5

Вы можете использовать библиотеку curses.h в Linux, как указано в другом ответе.

Вы можете установить его в Ubuntu:

Обновление sudo apt-get

sudo apt-get install ncurses-dev

Я взял часть установки из здесь.

Ответ 7

Замена для getch() - это getchar() объявленная в stdio.h. getchar() доступен в Windows и Linux.

Ниже приводится комментарий Макса Трукса.

Есть некоторые (несколько важные) различия между getch() и getchar().

1) getch() возвращается сразу после нажатия клавиши. getchar() позволяет вводить неопределенно долго, пока вы не введете EOL.

2) getch() ничего не выводит на экран. getchar() записывает все, что вы вводите на экран (даже EOL).

Если эти два различия не важны для пользователя, можно использовать getchar() в качестве замены, иначе это может быть не самой лучшей идеей.