Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Aufgabe 5 crawl - Arg Parser
Hallo Zusammen,
Ich benutze bei meinem ArgParser atatic char* arrays um mir die Pointer auf argv die ich per strtok erhalte zu speichern.
z.B.
static char *arguments[1000];
das Programm läuft auch einwandfrei, jedoch bin ich mir dessen bewusst, dass ein static char* array keine schöne Lösung ist, da ja hier meine args auf 1000 beschränkt wären.
Hat jemand einen Tipp für mich wie ich damit umgehen kann ohne mallocen zu müssen.
Du musst nicht jeden Eintrag aus [m]argv[/m] kopieren, es reicht, wenn du dir einfach den Pointer auf das Array wegspeicherst.
@izibi - aber um mir die einzelnen pointer wegzuspeichern brauche ich doch ein pointer Array, oder nicht?
damit ich dann durch arguments durchlaufen kann um mir meine Einträge zusammenzusammeln
Hmm, dann hab ich die Frage nicht ganz verstanden, mir ist nicht klar, was du mit strtok eigentlich tust. Zerstückelst du damit die Parameter am [m]=[/m]? Falls ja: Musst du nicht tun, du kannst beim Suchen ja vergleichen, ob z.B. [m]s[0…n] == “-foo=”[/m] und dann [m]&s[n+1][/m] zurückgeben.
Das klingt ja jetzt fast so, also ob der Parser nur unsere 4 erforderlichen Optionen unterstützen muss. Ich hab die Aufgabenstellung allerdings so verstanden, dass der Parser prinzipiell mit unendlich vielen und verschieden Optionen umgehen muss, wir dann aber nur die für uns nötigen Abfragen. Sprich ich hätte da jetzt eigentlich wieder eine verkettete Liste im Kopf gehabt… ein 4 elementiges Array würde die Sache vereinfachen. Zumal das vorgegebene Interface irgendwie keine Funktion deklariert um den allokierten Speicher wieder freizugeben.
@ Jackpot:
Ich hab das so umgesetzt wie Izibi das geschrieben hat und meine Implementierung kann mit beliebig vielen und beliebig langen Optionen umgehen.
Vergleichst du dann expilzit mit [m]“-maxdepth=”[/m], [m]“-name=”[/m], etc… oder mit beliebigen Ausdrücken der Art [m]“-[…]=”[/m]. Weil wenn ich doch anfangs nicht weiß wie lange meine übergebenen keys eigentlich sind, wie reicht es dann mir den Pointer zu speichern wenn der key-Teilstring nicht 0-terminiert sondern mit ‘=’ und ich das argv[] nicht manipulieren darf?
Also zum Beispiel wenn jemand das Programm mit [m]“-halleluja=”[/m] aufrufen würde, mich in meiner crawl dieser Parameter natürlich nicht interessiert, aber dann sollte der Parser doch trotzdem key und value vernünftig abgespeichert haben und bei Bedarf auch ausgeben können, oder?
Dafür musst du dir dann entweder eine eigene Vergleichsfunktion bauen oder das passend mit [m]strncmp(3)[/m] zusammenbauen. Das braucht dann nämlich keine \0-terminierten Strings mehr.
also ich hab das ungefähr so gemacht:
- nehme jeden string aus argv
- malloce eine string mit der größe von keyName länge + 1
- kopiere den string von dem current string von argv zu meinem malllocten string mit strcpy
- fuege am ende von meinem mallocten string ein “\0” ein
- benutze den mallocten string für ein compare
- free den mallocten string