Sziasztok!
A minap talalkoztam a következő feladattal:
Adott egy bemeneti file, amelynek minden sora egy URL-t tartalmaz a következő formátumban:
http://[usernév[:password]@]hostname/eleresiut/filenev[?parameterek]
A [] közti részek opcionálisak.
A feladat az URL ek különböző adattagjainak kinyerése, méghozzá úgy hogy a bemeneti filet csak karakterenként olvashatjuk és egy karaktert csak egyszer olvashatunk be. Ti ezt hogyan oldanátok meg?
Itt főleg az érdekelne hogy hogyan kezelitek azokat az eseteket, ahol opcionális adattag van,de azt hogy jelen van e az adattag, csak a későbbi input határozza meg. (pl az username mező esetén a @ karakter)
Előre is köszi!
- 2781 megtekintés
Hozzászólások
lex/flex yacc/bison kombó
Early algoritmus vagy CYK algoritmus, (egyéb verem automata)
BNF
- A hozzászóláshoz be kell jelentkezni
Köszi a választ. Azt elfelejtettem írni, hogy c/c++ ban kéne megoldani. Az Early algoritmust és a BNF-et azért lecsekkolom.
- A hozzászóláshoz be kell jelentkezni
http://hu.wikipedia.org/wiki/Determinisztikus_v%C3%A9ges_%C3%A1llapot%C…
if( allapot == USERNAME_OR_HOSTNAME && betu == '@' ){ save_username(); allapot = HOSTNAME; }
if( allapot == USERNAME_OR_HOSTNAME && betu == ':' ){ save_username(); allapot = PASSWORD; }
pár tucat 'if', nem nagy ügy :-)))
Vagy regexp-el is lehet: http://foad.org/~abigail/Perl/url3.regex
--
hup.user.js
- A hozzászóláshoz be kell jelentkezni
Miért nem olvasod be az egész sort egyszerre, aztán már könnyen szét tudod szedni. Persze enélkül is lehet ügyeskedni, de ha csak ez okozná a gondot, akkor talán ez a legegyszerűbb.
Most lehet nem segítettem sokat.
- A hozzászóláshoz be kell jelentkezni
használsz egy char vemet.
http:// eldobod, ha nem ezzel kezdődik hiba.
teszed le a verembe charokat.
ha kettőspontot találasz akkor, a vermben user név van kiszed eltárol.
ha @ jelet és nem volt user név kiszedve a veremböl, akkor usernév van a veremben, ha nem akkor jelszó kiszed eltárol.
pakolászol tovább
ha / találasz a veremben lévő cucc a hostname, kiszed eltárol (szerk: ha itt is vége lehet akkor, annak megfelően cselekedsz..)
pakolászol tovább
ha végére érsz akkor vagy ? jelet találsz, veremben a / ig vagy verem aljáig filenév van, a többi az elérési út.
ha kérdő jelet találtál az összes többi paraméter.
realloc, malloc használatát minimalizáld.
Foglalj le egy várható elemszámnak elgendő helyett elsőre (verem/stack), és ne 1 karakterenként bővitsd, ha kevés...
plusz hiba null hoszú sztrinkeg eltárolása lehet.
strndup() a barátod.
- A hozzászóláshoz be kell jelentkezni
vagy ha c++, akkor std::stack<char>
- A hozzászóláshoz be kell jelentkezni
Lassú lesz.
Nincs reserve() (sok allocálás), lassan konvertál char* -á vagy basic_string -gé.
Vagy tudsz valami pluszt az std -beli implemtációról ?
- A hozzászóláshoz be kell jelentkezni
Ez is lassú .
- A hozzászóláshoz be kell jelentkezni
Köszönöm a kimeritő választ,azt hiszem ez lesz az üdvözítő megoldaás.
- A hozzászóláshoz be kell jelentkezni
ilyen egyszerű esetnél nem kell verem, mert két iterátor elég a stringen: az egyik a 'verem' aljára, a másik a tetejére mutat
- A hozzászóláshoz be kell jelentkezni
char tömbre gondoltam, mint verem :)
De még jobb, ha az ember egybe beolvassa stringet , \0 karekterekkel megtűzdeli, és mutatók mutatnak megfelelő rész kezdetére.
- A hozzászóláshoz be kell jelentkezni
regexp.
---
Reactor error - core dumped!
- A hozzászóláshoz be kell jelentkezni