Как реализовать функцию getch() C в Linux?

В TurboC++ я могу использовать getch() функция от conio.h, Но в Linux gcc не предоставляет conio.h, Как я могу получить функциональность getch()?

12 ответов

Попробуй это conio.h файл:

#include <termios.h>
#include <unistd.h>
#include <stdio.h>

/* reads from keypress, doesn't echo */
int getch(void)
{
    struct termios oldattr, newattr;
    int ch;
    tcgetattr( STDIN_FILENO, &oldattr );
    newattr = oldattr;
    newattr.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
    ch = getchar();
    tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
    return ch;
}

/* reads from keypress, echoes */
int getche(void)
{
    struct termios oldattr, newattr;
    int ch;
    tcgetattr( STDIN_FILENO, &oldattr );
    newattr = oldattr;
    newattr.c_lflag &= ~( ICANON );
    tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
    ch = getchar();
    tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
    return ch;
}

Вы также можете использовать библиотеку ncurses в gcc для некоторых функций, подобных conio.h,

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

Проверьте проклятия:

http://en.wikipedia.org/wiki/Curses_%28programming_library%29

getch() кажется, включен в библиотеку curses.

Ты можешь использовать getch() эквивалент из libcaca:

__extern int caca_conio_getch (void)

Если по каким-либо причинам вы не можете использовать проклятия, попробуйте это:

# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <ctype.h>
# include <termios.h>

/* get a single char from stdin    */
int getch(void)
{
   struct termios oldattr, newattr;
   int ch;
   tcgetattr(0, &oldattr);
   newattr=oldattr;
   newattr.c_lflag &= ~( ICANON | ECHO );
   tcsetattr( 0, TCSANOW, &newattr);
   ch=getchar();
   tcsetattr(0, TCSANOW, &oldattr);
   return(ch);
}

В соответствии с этим кодом решения вы должны вручную использовать открытый исходный код для функций getch() и getche(), как описано в следующем коде.

#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 */
  new.c_lflag &= echo ? ECHO : ~ECHO; /* set 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);
}

Просто поместите это перед вашим основным методом кода

conio.h только в Дос,

для Linux используйте

sudo apt-get install libncurses-dev

& затем

-lncurses

// В IDE вы должны связать его: например: кодовые блоки, Настройка -> Компилятор -> Настройка компоновщика и добавить 'ncurses'

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

В Unix getch() является частью библиотеки ncurses. Но я написал обходной путь для этого вопроса, который позволяет вам использовать функциональность, подобную getch, без остатка проклятого багажа.

Вы также можете использовать системную команду для управления терминалом в Linux, например

      char getch()    {

        char c;

        system("stty raw -echo");

        c = getchar();

        system("stty -raw echo");

        return c;

}

Эта функция не требует, чтобы пользователь нажимал клавишу ввода, и принимает ввод от пользователя без повторения. Она требует, чтобы вы добавили библиотеку stdlib.h в свой код.

Примечание: эта функция применима только к ОС на базе UNIX.

Мы будем благодарны за любые улучшения или указание на какие-либо проблемы в коде.

С Уважением

Если вы хотите использовать conio.hв Ubuntu, затем выполните следующие действия:

  1. Открытый терминал
  2. sudo apt-get install git
  3. git clone https://github.com/zoelabbb/conio.h.git
  4. cd conio.h
  5. sudo mv conio.h /usr/include/
  6. Закройте IDE и снова откройте. Сделанный.

Если у вас возникли проблемы, перейдите по этой ссылке: введите описание ссылки здесь

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