Startparameter verarbeitung
-
Guten Tag,
ich wollte mal fragen ob es eigentlich so etwas wie eine schöne,
saubere "standard" Routine gibt um Startparameter zu verarbeiten.Viele Textbasierte programme kann man ja auch nur so (mit Parametern)
nutzen. Diese muss man meist so (zB) übergeben:prog.exe -a param1 -b param2 -c param3Wie wird das dann verarbeitet? Prinzipiell bekommt man doch erstmal
nur Strings mit den Inhalten:
argv[0] = c:\prog.exe
argv[1] = -a
argv[2] = param1
argv[3] = -b
...Die einzige Methode die mir jetzt einfallen würde wäre alle argumente
durchzutesten.. (ca so)for(int i = 1; i < argc; i++) { if(argv[i][0] == '-') { switch(argv[i][1]) { case 'a': cout << argv[i + 1] << endl; break; default: cout << "Unkown argument" << endl; break; } } }Bin mir aber nicht sicher ob das so auch elegant ist..
Besten Dank jetzt schonmal für eure Antworten
(Voraus .. und NICHT vorraus.. was man hier im Forum so alles lernt^^)(Ach ja, die Antwort muss jetzt nicht umbedingt irgendwas mit C++ zu tun haben, C würde mir völlig reichen.)
-
Wenn du assoziative Container wie
std::mapnutzt, kannst duconst char*auf irgendwas abbilden. Falls sich die Aktionen je nach Argument stark unterscheiden, kann der Wert-Typ auch ein Funktionszeiger (oder sogarstd::tr1::function) sein.Falls das Overkill ist, nimm
if-else. Aber sicher kein zeichenweisesswitch, das artet aus.
-
Für komplexere Kommandozeilen-Optionen empfiehlt sich Boost, bzw. eine Bibliothek daraus:
http://www.boost.org/doc/libs/1_44_0/doc/html/program_options.htmlFür kleineres würde ich aber auch zur Methode von Nexus raten.
Grüssli
-
Vielen Dank für die schnellen Antworten! Auch wenn boost auf den ersten
Blick leichter aussieht (habe noch nicht so viel Erfahrung mit C++)
werde ich wahrscheinlic die "map" Lösung verwenden.Interessieren würde mich noch wie man das ganze in reinem C realisieren
würde, vielleicht weiß das hier ja jemand (auch wenns das C++ Forum ist ;))
-
So ohne externe Bibliothek wäre es wohl am einfachsten mit
if-else. Du kannst dir zwar eine kleine Map (evtl. linear als sortiertes Array) nachbauen, aber die Vorteile zahlen sich nicht aus bei wenigen Optionen. Du musst auch bedenken, dass dazu wieder Speicheranforderungen etc. nötig sind. Und erst der Implementierungsaufwand...
-
Für reines C gibt es auch hübsche fertige Bibliotheken, zum Beispiel GNU getopt und andere. Dieses dient dazu, Kommandozeilen im GNU-Stil zu parsen. Sehr ausgereift und sehr weit verbreitet (logischerweise im ganzen GNU-Projekt
).Prinzipiell kannst du natürlich angucken, wie diese funktionieren, da quelloffen. Oder besser noch, gleich benutzen anstatt selber machen, sofern die GPL für dein Projekt in Frage kommt (nur ein potentielles Problem bei kommerzieller Software).
-
SeppJ schrieb:
Oder besser noch, gleich benutzen anstatt selber machen, sofern die GPL für dein Projekt in Frage kommt (nur ein potentielles Problem bei kommerzieller Software).
Das ist auch sonst ein Problem, wenn man sein eigenes Projekt nicht ebenfalls unter der GPL lizenzieren möchte. Was ich übrigens durchaus verstehen kann.
-
typedef function<int(char*)> func_f; /* ... */ map<char,func_f> test;Und wie führt man dann eine Funktion aus?^^
Ich hoffe die Frage scheint jetzt nicht allzu dumm,
bin wie gesagt unter C++ noch ein ziemlicher Neuling
-
Mit Boost sieht dein Code manchmal aus wie Brainfuck...
-
weißnochnix schrieb:
Und wie führt man dann eine Funktion aus?^^
Gleich wie eine normale Funktion. Steht auch in der Dokumentation.