Portál AbcLinuxu, 5. listopadu 2025 08:44
getch()?
getch() je např. v ncurses.
getc() (viz. man 3 getc)
switch (getch()){
case 'a' : vypis();
break;
}tak ze v dose ked stlacim klaves a, tak sa mi tato funkcia vypis hned vyvola, bez toho aby som zadaval za 'a' este 'enter'
initscr(); nodelay(); getch();
switch (getch()){
case 'a' : vypis();
break;
}
initscr();
cbreak();
switch(getch())
{
case 'a': printf("hallo");
break;
}
#include <ncurses.h>
int main()
{
initscr();
cbreak ();
noecho ();
switch(getch())
{
case 'a': printfw("hallo");
refresh();
break;
}
endwin();
return 0;
}
/tmp/ccVbJu1B.o: In function `main': 1.c:(.text+0x573): undefined reference to `initscr' 1.c:(.text+0x578): undefined reference to `cbreak' 1.c:(.text+0x57d): undefined reference to `stdscr' 1.c:(.text+0x585): undefined reference to `wgetch' collect2: ld returned 1 exit status
1.) Skus okno obnovit pomocí refresh ();
2.) Po ukončení musíš zrušit ncurses endwin ();
Příklad:
#include <curses.h> /* stdio.h neni nutne je v curses.h */
#include <ctype.h>
#define COLOR2 1 /* barvicka 1. */
#define COLOR1 2 /* barvicka 2. */
int main () {
int c;
char *s;
initscr ();
cbreak ();
noecho (); /* vypnuti echa */
start_color (); /* chceme barvy */
keypad (stdscr, TRUE); /* chceme klavesy pod makry KEY_neco */
curs_set(0); /* at tam ta mrska neblika */
if (!has_colors ()) { /* umi terminal barvy ? */
endwin ();
fputs ("Hmm.. tady barvy nejdou !", stderr);
exit (1);
}
/* barva - popredi - pozadi */
init_pair (COLOR1, COLOR_RED, COLOR_BLUE); /* barvicka 1. */
init_pair (COLOR2, COLOR_YELLOW, COLOR_BLACK); /* a druha */
attron (COLOR_PAIR( COLOR1 )); /* pouzivat barvu 1. */
mvaddstr (2, 5, "Cervene na modrem");
attron (COLOR_PAIR( COLOR2 ));
mvaddstr (3, 5, "Zlute na cernem");
attron (A_BOLD); /* od ted vse BOLD */
mvaddstr (4, 5, "Zlute na cernem a tucne");
attroff (COLOR_PAIR( COLOR2 )); /* vypne barvu */
mvhline(LINES-2, 0, ACS_HLINE, COLS); /* nakresli caru */
mvaddstr (LINES-1, COLS-15, "F10 - konec");
mvaddstr (10, 5, "Jmeno klavesy:");
while ( (c=getch()) != KEY_F(10)) {
s = (char *) keyname(c); /* jmeno klavesy ? */
mvhline(10, 20, ' ', COLS); /* smaz */
if (s)
mvprintw (10, 20, "'%s'", s);
else
mvprintw (10, 20, "'%c'", (isprint(c) ? c : '.'));
}
erase (); /* smaz nase vytvory */
refresh ();
endwin (); /* konec curses */
exit (0); /* ....bye */
}
initscr();
atexit((void(*)(void))endwin);
cbreak();
refresh();
switch(getch())
{
case 'a':
printw("hallo");
sleep(1);
break;
}... nakonec je potřeba zavolat endwin(), jinak ti to nenavrátí terminál do původního stavu. Na psaní a kreslení je potřeba pak používat funkce z knihovny ncurses (např. printw() místo printf()).
int main(void){
int *p_pole = NULL;
initscr();
atexit((void(*)(void))endwin);
cbreak();
refresh();
while (1){
printf("\tmenu\n1. obrazok\n2. vypis\n3. vypocitaj\n4. nacitaj hodnoty\n5. usporiadaj\n6. koniec");
printf("\n\nzadajte svoju volbu > ");
switch (getch()){
case '1' : system("clear"); obrazok();
break;
case '2' : system("clear"); vypis();
break;
case '3' : system("clear"); vypocitaj();
break;
case '4' : system("clear"); nacitaj_hodnoty(&p_pole);
break;
case '5' : system("clear"); usporiadaj(p_pole);
break;
case '6' : return 0;
}
//system("clear");
}
endwin();
}
a po spusteni programu je cista obrazovka
po výpisu.
refresh();
a né printf
#include <stdio.h>
#include <termios.h>
int main (void) {
struct termios term;
tcgetattr(0, &term);
term.c_lflag &= ~ICANON;
tcsetattr(0, TCSANOW, &term);
setbuf(stdin, NULL);
printf("Press any key to continue...\n");
getc(stdin);
return 0;
}
// Přečti nastavení terminálu.
struct termios terminal_settings, original_terminal_settings;
if (tcgetattr(input_fd, &terminal_settings) != 0) {
perror("could not read terminal settings");
return false;
}
// Zapamatuj si je, aby je šlo obnovit na konci programu.
original_terminal_settings = new struct termios;
memcpy(
original_terminal_settings,
&terminal_settings,
sizeof(struct termios)
);
// Nová nastavení terminálu.
terminal_settings.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP
| INLCR | IGNCR | ICRNL | IXON);
terminal_settings.c_oflag &= ~OPOST;
terminal_settings.c_oflag |= ONLCR; // Překlad LF -> CRLF.
terminal_settings.c_lflag &= ~ECHO; // Nevypisovat stisknuté klávesy.
terminal_settings.c_lflag &= ~ECHONL; // Nevypisovat klávesu Enter.
terminal_settings.c_lflag &= ~ICANON; // Vypnout kanonický režim.
terminal_settings.c_lflag &= ~IEXTEN; // Vypnout rozšířené zpracování znaků.
terminal_settings.c_cflag &= ~PARENB; // Žádná parita.
terminal_settings.c_cflag &= ~CSIZE;
terminal_settings.c_cflag |= CS8; // Osmibitové znaky.
// Pošli změněná nastavení do terminálu.
if (tcsetattr(input_fd, TCSADRAIN, &terminal_settings) != 0) {
perror("could not change terminal settings");
return false;
}
Ale pokud budeš chtít kreslit menu, tak musíš ještě řídit pohyb kurzoru, barvy, atd., to znamená posílat správné řídící sekvence (jejich seznam najdeš například zde), a to bude taky slušné maso
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.