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
Fórum › C / C++
Predvyplneny uzivatelsky vstup
Ř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.
To Matrix17:tato ochcavka ma tiez napadla ale je to nepouzitelne lebo nemam moznost ten default nijak upravit. a o to mi ide predovsetkym.
nasiel som kniznicu readline (http://tiswww.case.edu/php/chet/readline/rltop.html), ktora by snad mohla fungovat tak ako chcem
sami ale sami pisu ze je to velke a pomale. nepouzivate nieco ine? lepsie?
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" ;-)
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?
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.
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;
}
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() :-)
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;
}
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
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?
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..
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 :(
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
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
Pomoc - Uživatelsky definované fce — založil Venca
Moderátoři diskuze