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

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

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

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


person Jeegar Patel    schedule 19.09.2011    source источник
comment
Взгляните на эти ответы. Вам может помочь: stackoverflow.com/questions/ 1513734/   -  person Diego Sevilla    schedule 19.09.2011


Ответы (6)


#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
person niko    schedule 19.09.2011
comment
Спасибо, это работает, но мне пришлось заменить new чем-то другим, потому что это ключевое слово, я думаю - person Mihai Vilcu; 04.06.2013
comment
@cipher В Windows у вас есть _getch, включенный в API Windows, в ‹conio.h› - person Paul Stelian; 08.01.2017
comment
@MihaiVilcu new — это ключевое слово в C++, но не в C. - person Paul Stelian; 08.01.2017
comment
@PaulStelian Тогда я использовал mingw-gcc, и, если мне не изменяет память, у него не было conio или termios. - person cipher; 12.01.2017
comment
mingw имеет сокращенную версию conio с _getch() [это, или Code::Blocks с MinGW включает что-то еще] @cipher - person Paul Stelian; 13.01.2017
comment
в этом примере есть ошибка: когда эхо истинно, new.c_lflag &= ECHO неверно, он очистит все биты, кроме ECHO, должно быть new.c_lflag |= ECHO - person RedSoft; 10.03.2018
comment
getchar() возвращает int. Сжатие его в char приводит к тому, что он не может отличить допустимый символ со значением 255 (например, ÿ в кодировках ISO-8859-1 или CP1252) от ошибки ввода. - person Paulo1205; 01.04.2019
comment
Лучше ли использовать getch() из <conio.h>, если вы работаете в Windows? или так лучше? - person Dynamic Squid; 23.07.2020
comment
Как это будет взаимодействовать с тем фактом, что, судя по тому, что я наблюдал, Unix обычно повторяет символы, введенные в консоли, до того, как код попытается их прочитать? Что произойдет, если, например. программа ждала секунду перед первым вызовом getch(), и пользователь в это время вводил символы в консоли? - person supercat; 25.05.2021

#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, если вы не хотите, чтобы символ отображался.

person Community    schedule 03.05.2013
comment
@ mr-32 это в точности эквивалент Linux для getch(), используемого Visual Studio для Windows, за исключением printf() в последней строке этой функции. - person mf_; 04.05.2013

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

person Fafaman    schedule 19.09.2011

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

person Jan S    schedule 19.09.2011
comment
в одном условии я не хочу устанавливать новые вещи для этого .. любой другой вариант? - person Jeegar Patel; 19.09.2011

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

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

sudo apt-получить обновление

sudo apt-get установить ncurses-dev

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

person Ashish Ahuja    schedule 01.01.2016

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

person ralf htp    schedule 07.09.2017