Portál AbcLinuxu, 14. července 2025 15:34
Řešení dotazu:
Funkce getch() z unixové knihovny (n)curses? Tak povídej...Ja s céčkom len začínam, na nete som našiel getch() a putgh(), vo win fungovali s knihovňou stdio.h, nevedel som, že mám použiť inú knihovňu pre linux, na nete som našiel, že to nefunguje, preto som sa spýtal skúsenejších. Teda knihovňa sa volá: curses.h?
conio.h
je zalezitost DOS/Windows.
Jedna z moznosti je pouzit curses .. len ono to ma svoj dovod, preco sa to vola "curses". A nesuvisi to s cursorom ;)
Ale k veci. Ak sa ucis C, predpokladam, ze getch* fcie pouzivas na typicke ukazkove priklady. Raz pri jednom programe som potreboval fciu, co by sa spravala presne ako getche .. na public forach som nasiel vtedy toto (davam ti aj cely program s trivialnou ukazou):
#include <stdio.h> #include <termios.h> /* mygetch() */ #include <unistd.h> /* mygetch() */ int mygetch(); int main() { fprintf(stdout, "press something .. \n"); char c = (char)mygetch(); fprintf(stdout, "you've pressed: %c\n", c); return 0; } /* borrowed from public forums */ int mygetch() { struct termios oldt,newt; int ch; tcgetattr( STDIN_FILENO, &oldt ); newt = oldt; newt.c_lflag &= ~( ICANON | ECHO ); tcsetattr( STDIN_FILENO, TCSANOW, &newt ); ch = getchar(); tcsetattr( STDIN_FILENO, TCSANOW, &oldt ); return ch; }
mygetch()
sa tu sprava presne ako getche()
v DOSe. Manualova stranka k tcgetattr by ti k tomu povedala viac (riadok 24 nastavuje co sa bude robit po stisku, ak to poviem tak zjednodusene).
c = getchar();
while (getchar() != Enter)
;
mygetch
fcia. len osetrenie vstupu je elegantnejsie. ber to s humorom, ale ked vidim taketo slucky, tak ma vzdy napadne citat z pelisok: "komu tim prospejete!" :)
ked sa zacina ucit, tak nepotrebuje (zatial) riesit ako to funguje - zavola si mygetch()
a sustredi sa na problem, ktory riesi v ulohe.
getch
(teda orig fcia z conio.h
) tak musi spravit nejaky kompromis.
na niektore priklady, reps. ukazky problemu sa proste ten getch()
hodi, ci uz len na nejaky vyber z menu alebo nejake very easy eye candy ukazky (co niekedy celkom tiez potesi, ked sa clovek zacina ucit a nejedna sa o serioznu vec)
Ideme v céčku od základov a využívame len to, čo bolo v lekciách. Programy testujem na win aj na linuxe podľa toho v akom prestredí ich vytvorili ich tvorcovia - začiatočníci.Co by si cakal od zaciatocnika? Tak isto nebol uvedeny vek zacinajuceho programatora. Ja s tebou inak suhlasim, som za dodrziavanie best practices, nech sa ich ucia pokial mozno co najskor. Ale su to zaciatocnici - a vtedy to treba brat trosku s rezervou. Inak sa mi tento priklad hodi analogicky na to, ako sa vela krat hovorilo, ze z akych dovodov niekto pise shellove skripty v bash-y, ked ani len v tom scripte nevyuziva ziaden bashism. A napriek tomu sa mrte skriptov v komunitach zacina tym odpornym:
/bin/bash
. So much for compatibility :/ .. ale to som uz mimo temu..
z akych dovodov niekto pise shellove skripty v bash-y, ked ani len v tom scripte nevyuziva ziaden bashism.Z jednoduchých: udělal to někdy naopak (tedy bashový skript s intepretem /bin/sh) a dostal vynadáno -- oprávněně. No a /bin/bash je prostě autorova volba interpretu. Skript nemusí obsahovat shodou okolností žádné bashismy, když má ještě pět řádků, ale čeká se, že je bude obsahovat, až se rozroste na padesát -- skript v bashi je to přitom celou dobu.
Z jednoduchých: udělal to někdy naopak (tedy bashový skript s intepretem /bin/sh) a dostal vynadáno -- oprávněně.no toho cloveka, co mu vynadal treba pouzit uz tebou spomenute riesenie - obesit na platane.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.