Predvyplneny uzivatelsky vstup – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Predvyplneny uzivatelsky vstup – C / C++ – Fórum – Programujte.comPredvyplneny uzivatelsky vstup – C / C++ – Fórum – Programujte.com

 

olgo0
Věrný člen
3. 9. 2007   #1
-
0
-

zdravim. potrebujem ziskat vstup od uzivatela ale s tym ze uz bude mat nejaku defaultnu hodnotu ktora sa uz len edituje a nebude ju treba celu pisat. neviem ci som sa vyjadril jasne. napriklad vyber adresara. uzivatel bude zadavat cestu ale ako default by mal napr svoj home adresar. bud teda iba potvrdi alebo uravi pripadne uplne zmeni. diky

btw.: ciste c

Nahlásit jako SPAM
IP: ...–
"Boze, dopraj mi, prosim ta, petdesiat rokov prace a zabavy, a potom nahlu smrt v spanku." J. Grisham
Matrix17
~ Anonymní uživatel
300 příspěvků
3. 9. 2007   #2
-
0
-

Řešení je velice snadné. A to pomocí podmínky. Do výpisu hodíš něco ve smylu pokud stiskneš ENTER použije implicitní nastavení + něco jako zadej cestu k souboru nebo počet obyvatel (to už je jedno co). No a pak pomocí tý podmínky už jen zjistíš jestli byl zadán prázdný řádek. Pokud ano hodí se do proměné implicitní hodnota pokud ne použije se načtená hodnota.

Nahlásit jako SPAM
IP: ...–
olgo0
Věrný člen
4. 9. 2007   #3
-
0
-

To Matrix17:tato ochcavka ma tiez napadla ale je to nepouzitelne lebo nemam moznost ten default nijak upravit. a o to mi ide predovsetkym.

Nahlásit jako SPAM
IP: ...–
"Boze, dopraj mi, prosim ta, petdesiat rokov prace a zabavy, a potom nahlu smrt v spanku." J. Grisham
olgo0
Věrný člen
4. 9. 2007   #4
-
0
-
Nahlásit jako SPAM
IP: ...–
"Boze, dopraj mi, prosim ta, petdesiat rokov prace a zabavy, a potom nahlu smrt v spanku." J. Grisham
Zelenáč0
Posthunter
4. 9. 2007   #5
-
0
-

Imho by to slo.. Budes mit retezec s nejakou defaultni hodnotou, jeho delku a polohu_cursoru. V nekonecnem cyklu se ti vzdy vymaze radek, vypise ten retezec, za nim (delka-poloha_cursoru)*backspace. Pockas si na stisk klavesy - pokud to bude sipka doprava/doleva, prictes/odectes polohu_cursoru. Pokud to bude pismeno/cislo/jiny pripustny znak, umistis ho na patricne misto v retezci a posunes cursor. Pokud to bude enter, ukoncis cyklus. Jediny problem bych videl v te "hlidaci" funkci cekajici na stisk klavesy..
PS. mozna jsem to trosicku blbe podal, ale je to tim, ze uz jsem rozespalej.. Zejtra se na to zkusim podivat "prakticky" ;-)

Nahlásit jako SPAM
IP: 62.24.71.–
sn3d0
Věrný člen
5. 9. 2007   #6
-
0
-

hmm akosi som nepochopil o co ide.Ide o to ze ked uzivatel proste nenapise nic, len zmackne enter aby sa pouzil nejaky default text? alebo som uplne mimo?Dala by sa uviest nejaka ukazka ze co to ma robit a ako sa to ma spravat?

Nahlásit jako SPAM
IP: ...–
shutdown -h now
olgo0
Věrný člen
5. 9. 2007   #7
-
0
-

To sn3d: ukazka je ten readline (teda ked som to spravne pochopil) a v podstate by sa to dalo riesit tak ako povedal zelenac.

predstav si klasicky scanf. ked ho zavolas mozes pisat ale uplne od zaciatku. ja by som mu rad udal nejaky retazec ktory by mohol uzivatel editovat ako v konzole. snad je to janejsie.

Nahlásit jako SPAM
IP: ...–
"Boze, dopraj mi, prosim ta, petdesiat rokov prace a zabavy, a potom nahlu smrt v spanku." J. Grisham
Zelenáč0
Posthunter
5. 9. 2007   #8
-
0
-

Takze jsem vykoumal tohle reseni:

#include <conio.h>

#include <stdio.h>

#define ARROW 224
#define RIGHT 77
#define LEFT 75
#define ENTER 13
#define BACKSPACE 8
#define DELETE 83
#define INSERT 82


void readline(char *TEXT, char *DEF, int MAX_LEN){

int key; // klavesa
int arrow = 0; // stisknuta sipka
int n;

int insert = 0; // prepisovani (0 - zakazano, 1 - povoleno)
int cursor = 0; // pozice cursoru
int len = strlen(DEF); // delka
int tlen = strlen(TEXT);

while(1){

printf("\r"); // vymaze radek

for(n=0;n<(tlen+MAX_LEN+2);n++){
printf(" ");
}
for(n=0;n<(tlen+MAX_LEN+2);n++){
printf("\b");
}

printf("%s: %s", TEXT, DEF);
for(n=0;n<(len-cursor);n++){ // pozice cursoru
printf("\b");
}

key = getch(); // pocka na znak

if(key == ENTER){ // ENTER
break;
}

if(key == ARROW){
arrow = 1;
continue;
}

if(arrow == 1){
arrow = 0;

if(key == LEFT && cursor > 0){ // LEVA SIPKA
cursor--;
} else if(key == RIGHT && cursor < len){ // PRAVA SIPKA
cursor++;
} else if(key == DELETE && cursor < len){ // DELETE

len--;
for(n=cursor;n<=len;n++){
DEF[n] = DEF[n+1];
}
} else if(key == INSERT){ // INSERT

if(insert == 0){
insert = 1;
} else{
insert = 0;
}
}

continue;
}

if(((len < (MAX_LEN-1) && insert == 0) || (cursor < (MAX_LEN-1) && insert != 0)) && key != BACKSPACE){

if(insert == 0){
len++;
for(n=len;n>=cursor;n--){
DEF[n+1] = DEF[n];
}
} else{
if(cursor > MAX_LEN || DEF[cursor] == '\0'){
len++;
}
}

DEF[cursor] = key;
cursor++;

continue;
}

if(key == BACKSPACE && cursor > 0){ // BACKSPACE

len--;
for(n=(cursor-1);n<=len;n++){
DEF[n] = DEF[n+1];
}
cursor--;

continue;

}

}

}


int main()
{

char DEF[50] = "www.programujte.com";
readline("Tvoje oblibena stranka", DEF, 50);

printf("\n\nStranka \"%s\" je super!\n", DEF);

getch();
return 0;
}

Nahlásit jako SPAM
IP: 62.24.71.–
Zelenáč0
Posthunter
5. 9. 2007   #9
-
0
-

Doufam, ze to dela to, co si chtel ;-)

Nahlásit jako SPAM
IP: 62.24.71.–
olgo0
Věrný člen
6. 9. 2007   #10
-
0
-

To Zelenáč: to conio.h pouzivas pod linuxom?

Nahlásit jako SPAM
IP: ...–
"Boze, dopraj mi, prosim ta, petdesiat rokov prace a zabavy, a potom nahlu smrt v spanku." J. Grisham
Zelenáč0
Posthunter
6. 9. 2007   #11
-
0
-

Ne - i kdyz jsem nekde nejakou udajne obstojnou alternativu conio pro Linux videl, nepodarilo se mi ji stahnout.. Bohuzel f-ci podobnou getch() napsat nedokazu..
Pricip, kterej jsem predtim popsal, tam ale je, takze ted uz "jen" staci nacmarat vlastni getch() :-)

Nahlásit jako SPAM
IP: 62.24.71.–
sn3d0
Věrný člen
7. 9. 2007   #12
-
0
-

v curses je:



#include <curses.h>

int getch(void);
int wgetch(WINDOW *win);
int mvgetch(int y, int x);
int mvwgetch(WINDOW *win, int y, int x);


alebo



#include <stdio.h>
#include <termios.h>
#include <unistd.h>

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

Nahlásit jako SPAM
IP: ...–
shutdown -h now
olgo0
Věrný člen
7. 9. 2007   #13
-
0
-

pokusal som sa aj sam nieco zbastlit pomocon curses ale narazal som stale na buffrovanie vstupu. niekde som dokonca vydel ze rozumne platform-indefendent riesenie ani neexistuje co je docela skoda. este sa ale popozeram

Nahlásit jako SPAM
IP: ...–
"Boze, dopraj mi, prosim ta, petdesiat rokov prace a zabavy, a potom nahlu smrt v spanku." J. Grisham
olgo0
Věrný člen
8. 9. 2007   #14
-
0
-

To sn3d: thx ten tvoj kod konecne funguje. idu ti aj rozsirene klavesy? lebo mne nie. da sa to nejako zapat? alebo sa to musi pracne lovit s tej zmesy znakov?

Nahlásit jako SPAM
IP: ...–
"Boze, dopraj mi, prosim ta, petdesiat rokov prace a zabavy, a potom nahlu smrt v spanku." J. Grisham
sn3d
~ Anonymní uživatel
564 příspěvků
8. 9. 2007   #15
-
0
-

Bohuzial ak pouzivas to s tym termios tak len to co moze vratit getchar. Ak potrebujes kompletne ovladnut klavesnicu tak odporucam knihu Linux zaciname programovat. Tam je venovana cela kapitola terminalom a je tam aj to ako spravit detekciu stisku klavesy ako v MS-DOSe..

Nahlásit jako SPAM
IP: ...–
olgo
~ Anonymní uživatel
471 příspěvků
8. 9. 2007   #16
-
0
-

To sn3d: o podobnej knihe som uvazoval ale nie nejak hlboko lebo z financnej stranky je to hudba dalekej buducnosti :) (co hovorite na knihu "umenie programovat pod unixom" ? neni som si isti ale vola sa nejak podobne).
ja som zbastlil tohto lovca klaves ale popri tom som zistil ze kazdy terminal (emulator terminalu) si vracia co chce takze neviem ako to bude fungovat. ked mate doma nieco "exoticke" tak to pls problite.



#include <stdio.h>
#include <ncurses.h>
#include <termios.h>
#include <unistd.h>

int a;

int main(){

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

while(1){
a = mygetch();
printf("1st key \'%c\' (%d, 0x%x)\n", a, a, a);
if(a == 27){
a = mygetch();
printf("2nd key \'%c\' (%d, 0x%x)\n", a, a, a);
switch(a){
case '[': a = mygetch();
printf("3rd key \'%c\' (%d, 0x%x)\n", a, a, a);
switch(a){
case 'A': printf("Up Arrow\n"); break;
case 'B': printf("Down Arrow\n"); break;
case 'C': printf("Right Arrow\n"); break;
case 'D': printf("Left Arrow\n"); break;

case 'H': printf("Home\n"); break;
case 'F': printf("End\n"); break;

case '1': a = mygetch();
printf("4th key \'%c\' (%d, 0x%x)\n", a, a, a);
switch(a){
case 49: printf("F1\n"); break;
case 50: printf("F2\n"); break;
case 51: printf("F3\n"); break;
case 52: printf("F4\n"); break;
case 53: printf("F5\n"); break;
case 55: printf("F6\n"); break;
case 56: printf("F7\n"); break;
case 57: printf("F8\n"); break;
case '~': printf("Home\n"); break;
default:
printf("unknown key \'%c\' (%d, 0x%x)\n", a, a, a);
}
if(a != '~'){ // za ~ nejde ~
mygetch(); // hide ~
}
break;
case '2': a = mygetch();
printf("4th key \'%c\' (%d, 0x%x)\n", a, a, a);
switch(a){
case 48: printf("F9\n"); break;
case 49: printf("F10\n"); break;
case 51: printf("F11\n"); break;
case 52: printf("F12\n"); break;
case 126: printf("Insert\n"); break;
default:
printf("unknown key \'%c\' (%d, 0x%x)\n", a, a, a);
}
if(a != '~'){ // za ~ nejde ~
mygetch(); // hide ~
}
break;
case '3':
printf("Delete\n");
mygetch(); // hide ~
break;
case '4':
printf("End\n");
mygetch(); // hide ~
break;
case '5':
printf("Page Up\n");
mygetch(); // hide ~
break;
case '6':
printf("Page Down\n");
mygetch(); // hide ~
break;
case '7':
printf("Home\n");
mygetch(); // hide ~
break;
case '8':
printf("End\n");
mygetch(); // hide ~
break;
case '[': a = mygetch();
printf("4th key \'%c\' (%d, 0x%x)\n", a, a, a);
switch(a){
case 'A': printf("F1\n"); break;
case 'B': printf("F2\n"); break;
case 'C': printf("F3\n"); break;
case 'D': printf("F4\n"); break;
case 'E': printf("F5\n"); break;
default:
printf("unknown key \'%c\' (%d, 0x%x)\n", a, a, a);
}
break;
default: printf("nothing jet\n");
}
break;
case 'O': a = mygetch();
printf("3rd key \'%c\' (%d, 0x%x)\n", a, a, a);
switch(a){
case 'P': printf("F1\n"); break;
case 'Q': printf("F2\n"); break;
case 'R': printf("F3\n"); break;
case 'S': printf("F4\n"); break;


case 'j': printf("*\n"); break;
case 'k': printf("+\n"); break;
case 'm': printf("-\n"); break;
case 'n': printf(".\n"); break;
case 'o': printf("/\n"); break;
case 'q': printf("1\n"); break;
case 'r': printf("2\n"); break;
case 's': printf("3\n"); break;
case 't': printf("4\n"); break;
case 'u': printf("5\n"); break;
case 'v': printf("6\n"); break;
case 'w': printf("7\n"); break;
case 'x': printf("8\n"); break;
case 'y': printf("9\n"); break;
default:
printf("unknown key \'%c\' (%d, 0x%x)\n", a, a, a);
}
break;
}
}
printf("\n\n\n\n");
}
return 0;
}

edit: omluvam sa za ten bordel (chvylu znaky - chvylu cisla) ale dufal som ze to nebudem potrebovat :(

Nahlásit jako SPAM
IP: ...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 47 hostů

Podobná vlákna

Uzivatelsky vstup — založil tecka

Predvyplneny formular — založil majkis

Uživatelský javascript — založil návštěvník

Více uživatelský systém — založil TomasUL

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý