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

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

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

4b9b3361

Ответ 1

Попробуйте этот 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.

Ответ 3

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

Ответ 5

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

Ответ 6

В соответствии с этим решением code вы должны вручную использовать открытый исходный код для функций 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);
}

Просто поставьте его перед основным методом кода

Ответ 7

conio.h находится только в Dos,

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

sudo apt-get install libncurses-dev

& то

-lncurses

//В IDE вам нужно связать его: например: codeblocks, Setting → Compiler → Linker setting и добавьте ncurses

Ответ 8

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

Ответ 9

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

__extern int caca_conio_getch (void)

Ответ 10

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

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

Ответ 11

Функция getch() включена в библиотеку conio.h, но стандартная библиотека conio.h недоступна в linux, вместо этого мы можем использовать заголовочный файл curses.h. curses.h содержит определения для функций обработки экрана и оптимизации.

curses.h документация

http://pubs.opengroup.org/onlinepubs/007908775/xcurses/curses.h.html

1. Установка curses.h в Linux

//Для дистрибутивов Linux на основе Debian

sudo apt install -y libncurses5-dev libncursesw5-dev

//Для Fedora

sudo yum установить ncurses-devel

2. Программа компиляции (мое .c файл называется getchDemo)

g++ -o outputFile getchDemo.c -lncurses

3. Запуск программы

./выходной файл

sample program with output