C, Linux: Tastatur-Puffer abfragen?

Gast #385658
Lesenswert?

Danke!

Warum benötigt

  printw("Press any key to end program\n");

  nodelay(stdscr, FALSE);
  getch();
  endwin();

  printf("Program successfully terminated. Thank you.\n\n");

  return EXIT_SUCCESS;
}

3 Zeichen, um zu funktionieren? Die beiden letzten sind dann noch auf
der Konsole zu sehen. Hat das was mit der Erkennung von Sondertasten zu
tun?

Danke!
Gast #385660
Lesenswert?

hallo,

schaue dir tcsetattr, tcgetattr
tc steht für terminal control
damit sind viele Dinge möglich, zb Abschalten von Echo
damit man passwort eingeben kann usw
(kann bei bedarf Stück Code posten)

ich weiss nicht ob diese Funktionen in libc sind
aber immerhin bekommt ihr keine Abhängigkeit
ncurses dazulinken zu müssen

Grüsse, Daniel
Gast #385663
Lesenswert?

zuerst Beispiel echo abschalten
////////////////////////////////////////
cat echo.c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <signal.h>

struct termios term_attr;
int old_flags;

void restore()
{
    term_attr.c_lflag = old_flags;
    tcsetattr(0 /* STDIN */, TCSAFLUSH, &term_attr);
    exit(100);
}

int main()
{
    char passwd[20];
    if(tcgetattr(0, &term_attr) != 0)
        return 1;
    old_flags = term_attr.c_lflag;
    term_attr.c_lflag &= ~ECHO;
    if(tcsetattr(0, TCSAFLUSH, &term_attr) != 0)
        return 2;
    printf("Password: ");
    printf("%s", fgets(passwd, 20, stdin));
    signal(SIGINT, restore);
    while(1)
        sleep(2);
    return EXIT_SUCCESS;
}
////////////////////////////////////////


und jetzt beispiel mit Einlesen von Zeichen ohne Return
drücken zu müssen

////////////////////////////////////////////////////
cat term1.c
#include <stdlib.h>
#include <stdio.h>
#include <termios.h>
#include <string.h>
#include <signal.h>

static struct termios stored_settings;

void set_keypress(void)
{
    struct termios new_settings;
    tcgetattr(0,&stored_settings);
    new_settings = stored_settings;
    /* Disable canonical mode, and set buffer size to 1 byte */
    new_settings.c_lflag &= (~ICANON);
    new_settings.c_cc[VTIME] = 0;
    new_settings.c_cc[VMIN] = 1;
    tcsetattr(0,TCSANOW,&new_settings);
}

void reset_keypress(void)
{
    tcsetattr(0,TCSANOW,&stored_settings);
}

void sig_int()
{
    reset_keypress();
    exit(100);
}

int main()
{
    signal(SIGINT, sig_int);
    set_keypress();
    while(1)
    {
        int i = getc(stdin);
        printf("\t%c", i);
    }
    return EXIT_SUCCESS;        /* never reached */
}
////////////////////////////////////////////////////

es ist sicher noch mehr möglich
wie gesagt im Netz finden sich sicherlich andere Beispiele

Gruss, Daniel

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren