Что эквивалентно getch () и getche () в Linux? - PullRequest
55 голосов
/ 19 сентября 2011

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

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

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

Ответы [ 7 ]

68 голосов
/ 19 сентября 2011
#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'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;
}

Выход:

(getche example) please type a letter: g
You typed: g
(getch example) please type a letter...
You typed: g
30 голосов
/ 03 мая 2013
#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, если вы не хотите, чтобы символ отображался.

7 голосов
/ 19 сентября 2011

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

4 голосов
/ 19 сентября 2011

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

0 голосов
/ 07 сентября 2017

Как сказано выше getch() находится в библиотеке ncurses.ncurses должен быть инициализирован , то есть getchar () возвращает одинаковое значение (27) для клавиш со стрелками вверх и вниз для этого

0 голосов
/ 01 января 2016

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

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

sudo apt-get update

sudo apt-get install ncurses-dev

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

0 голосов
/ 27 марта 2014

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

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

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

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

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

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

...