¿Cuál es el equivalente a getch() y getche() en Linux?

3 minutos de lectura

avatar de usuario
Jeegar Patel

No puedo encontrar el archivo de encabezado equivalente para conio.h en Linux.

¿Hay alguna opción para getch() & getche() funcion en linux?

Quiero hacer un menú base de cambio de caso donde el usuario dará su opción simplemente presionando una tecla y el proceso debe avanzar. No quiero permitir que el usuario presione ENTER después de presionar su elección.

  • Echa un vistazo a estas respuestas. Puede ayudarte: stackoverflow.com/questions/1513734/…

    – Diego Sevilla

    19 de septiembre de 2011 a las 9:57

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

quitar el ultimo printf si no desea que se muestre el carácter.

  • @mr-32 este es exactamente el equivalente de Linux a getch() utilizado por Visual Studio para Windows, menos printf() en la última línea de esta función

    – mf_

    4 mayo 2013 a las 12:10

Le sugiero que use curses.h o ncurses.h, estos implementan rutinas de administración de teclado, incluido getch(). Tiene varias opciones para cambiar el comportamiento de getch (es decir, esperar a que se presione una tecla o no).

Hay una función getch() en la biblioteca ncurses. Puede obtenerlo instalando el paquete ncurses-dev.

  • en una condición, no quiero instalar cosas nuevas para eso … ¿alguna otra opción?

    – Jeegar Patel

    19 de septiembre de 2011 a las 10:21

avatar de usuario
Ashish Ahuja

Puedes usar el curses.h biblioteca en Linux como se menciona en la otra respuesta.

Puedes instalarlo en Ubuntu por:

sudo apt-obtener actualización

sudo apt-get install ncurses-dev

Tomé la parte de instalación de aquí.

Como se dijo arriba getch() está en el ncurses biblioteca. ncurses tiene que ser inicializadovea, es decir, getchar() devuelve el mismo valor (27) para las teclas de flecha arriba y abajo para esto

avatar de usuario
ss ana

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

Producción:

(getche example) please type a letter: g
You typed: g
(getch example) please type a letter...
You typed: g

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad