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

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


person Hits    schedule 18.07.2010    source источник
comment
turbo c мертв. Не используйте его.   -  person    schedule 31.07.2017
comment
Возможный дубликат эквивалента Linux для conio.h getch()   -  person n. 1.8e9-where's-my-share m.    schedule 20.02.2018


Ответы (11)


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

person Shobhit    schedule 12.04.2014
comment
Действительно ли требуется флаг ICANON? Каков его эффект? - person domsson; 18.11.2020

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

person Carl Smotricz    schedule 18.07.2010
comment
Эхо на экране — не единственная разница между getch() и getchar(). getch() не ждет возврата каретки перед чтением из буфера. Например. чтобы ввести «а» с помощью getchar(), вы должны ввести a[ENTER]. С getch() вам нужен только тип «a». - person Jamie Wong; 18.07.2010

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

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

person Jamie Wong    schedule 18.07.2010
comment
Согласитесь, голосование против неоправданно - curses фактически предоставляет функцию getch(). - person caf; 19.07.2010
comment
Может быть, люди считают это излишеством - person Isaac; 15.10.2015
comment
@Isaac Исаак Если вы используете одну часть conio.h, то вы, вероятно, используете и другие. И если вы портируете приложение, которое активно использует conio.h, curses, вероятно, лучший выбор. Я думаю, что отрицательный ответ больше похож на ответ, выглядящий только по ссылке. - person Damian Yerrick; 18.11.2015
comment
Я проголосовал за это, потому что это ответ только по ссылке, и в его нынешнем виде он, вероятно, должен быть скорее комментарием, чем ответом. Хотя на самом деле это может быть релевантной ссылкой, я бы проголосовал, если бы вы действительно добавили абзац текста прямо в свой пост, о библиотеке curses и о том, почему вы считаете, что это важно для решения проблемы OP. - person moooeeeep; 26.12.2015

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

person che    schedule 18.07.2010

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

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

person Shubham Sharma    schedule 21.08.2016

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

# 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);
}
person piper    schedule 20.06.2018

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

person luser droog    schedule 22.05.2012

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

для линукса используйте

sudo apt-get install libncurses-dev

& тогда

-lncurses

// В IDE вы должны связать это: например: codeblocks, Setting -> Compiler -> Linker settings и добавить 'ncurses'

person THEOS    schedule 22.10.2016

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

person ralf htp    schedule 07.09.2017

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

__extern int caca_conio_getch (void)
person Sauron    schedule 20.02.2018

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

char getch()    {

        char c;

        system("stty raw -echo");

        c = getchar();

        system("stty -raw echo");

        return c;

}

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

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

Любые улучшения или указание на какие-либо проблемы в коде будут оценены

С Уважением

person Zubair Ahmad    schedule 30.04.2021
comment
Хотя технически это работает, система и зависимость от утилиты просто оскорбляют мои чувства; см. viewsourcecode.org/snaptoken/kilo/02.enteringRawMode.html - person Konrads; 30.04.2021