Domanda Che cosa è equivalente a getch () e getche () in Linux?


Non riesco a trovare il file di intestazione equivalente per conio.h in Linux.

C'è qualche opzione per getch() & getche() funzione in Linux?

Voglio creare un menu di base dell'interruttore in cui l'utente darà la sua opzione semplicemente premendo un tasto e il processo dovrebbe essere spostato in avanti. Non voglio consentire all'utente di premere INVIO dopo aver premuto la sua scelta.


44
2017-09-19 09:55


origine


risposte:


#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 */
  if (echo) {
      new.c_lflag |= ECHO; /* set echo mode */
  } else {
      new.c_lflag &= ~ECHO; /* set no 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);
}

/* 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;
} 

Basta copiare queste funzioni e usarlo. Ho trovato questo frammento su Google molto tempo prima e l'ho salvato, finalmente l'ho aperto dopo tanto tempo per te! Spero che aiuti! Grazie


64
2017-09-19 10:21



char getch(){
    /*#include <unistd.h>   //_getch*/
    /*#include <termios.h>  //_getch*/
    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;
 }

copia questa funzione e usala, non dimenticare l'include

remove the last printf if you dont want the char to be displayed


27
2017-09-19 10:03



Vi suggerisco di usare curses.h o ncurses.h questi implementano le routine di gestione della tastiera incluso getch (). Sono disponibili diverse opzioni per modificare il comportamento di getch (ad esempio, attendere la pressione di un tasto o meno).


7
2017-09-19 10:01



C'è una funzione getch () nella libreria ncurses. Puoi ottenerlo installando il pacchetto ncurses-dev.


4
2018-01-01 11:15



Puoi usare il curses.h libreria in linux come menzionato nell'altra risposta.

Puoi installarlo in Ubuntu di:

sudo apt-get update

sudo apt-get install ncurses-dev

Ho preso la parte di installazione da Qui.


0
2017-09-07 13:03



Come detto sopra getch() è nel ncurses biblioteca. ncurses deve essere inizializzato, vedi ad es. getchar () restituisce lo stesso valore (27) per i tasti freccia su e giù per questo


0
2018-03-26 20:16



La sostituzione per getch() è getchar() dichiarato in stdio.h. getchar() è disponibile su Windows e Linux.


-2