Как реализовать функцию getch () C в Linux? - PullRequest
16 голосов
/ 18 июля 2010

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

Ответы [ 10 ]

27 голосов
/ 12 апреля 2014

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

7 голосов
/ 18 июля 2010
6 голосов
/ 18 июля 2010

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

1 голос
/ 18 июля 2010

<a href="http://www.mkssoftware.com/docs/man3/curs_getch.3.asp" rel="nofollow noreferrer">getch()</a> представляется включенным в библиотеку curses .

0 голосов
/ 20 июня 2018

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

# 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);
}
0 голосов
/ 20 февраля 2018

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

__extern int caca_conio_getch (void)
0 голосов
/ 07 сентября 2017

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

0 голосов
/ 23 октября 2016

conio.h только в Dos,

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

sudo apt-get install libncurses-dev

& затем

-lncurses

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

0 голосов
/ 21 августа 2016

В соответствии с этим решением 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);
}

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

0 голосов
/ 22 мая 2012

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

...