Commandline parser



  • die Funktion main sieht ja so aus

    main(int argc, char *argv[]){...}
    

    Gibt es eine einfache Möglichkeit einen String in die Bestandteile *argv[] zu zerlegen so wie es main(..) beim Start eines Programms macht? Nach Möglichkeit möchte ich mir keinen eigenen Parser schreiben sondern etwas Fertiges benutzen.

    Also aus '1 2 "3 4" 5 "test Test"' soll dann sowas entstehen:
    1
    2
    3 4
    5
    test Test



  • strtok()




  • Mod

    Wade1234 schrieb:

    strtok()

    Nein, strtok wendet keine komplexen Regeln wie das hier gewünschte Quoting an. strtok ist dann und nur dann gut, wenn man eine Zeichenkette stumpf an einer einzigen Art von Delimiter trennen möchte.

    Die richtige Antwort hängt von den Details ab.

    Wenn ich mal annehme, dass der Threadersteller den String exakt genau so wie von einer POSIX-Shell verarbeitet haben möchte (inklusive Variablenersetzung!) und unter einem POSIX-System unterwegs ist, dann wäre die POSIX-Funktion wordexp das richtige.

    Wenn er wirklich nur an Leerzeichen und Doublequotes trennen möchte (und dabei Backslashes, Singlequotes und andere Sonderzeichen als ganz normale Zeichen gelten sollen), dann läge es nahe, sich schnell einen eigenen Parser dafür zu schreiben. Das sind bloß ein paar Zeilen Code. Wobei selbst dieser einfache Regelsatz erfordert, dass man noch Zusatzfragen beantwortet, wie was passieren soll, wenn ein Quote nicht mehr geschlossen wird.

    Wenn es irgendwas dazwischen sein soll, wo es zu aufwendig ist, einen eigenen Parser zu schreiben, aber die fertigen Parser nicht genau passen, dann sollte man sich mal einen Parsergenerator wie (f)lex angucken.

    DocShoe schrieb:

    boost::program_options

    Falsche Sprache.



  • SeppJ schrieb:

    Wenn ich mal annehme, dass der Threadersteller den String exakt genau so wie von einer POSIX-Shell verarbeitet haben möchte (inklusive Variablenersetzung!) und unter einem POSIX-System unterwegs ist, dann wäre die POSIX-Funktion wordexp das richtige.

    Stimmt fast, nur dass ich Windows nutze. Parsen auf Leerzeichen empfinde ich als einfach, da hätte ich euch nicht mit belästigt. Aber in der Commandline werden auch Quotes und Double-Quotes in Quotes behandelt, die dann wieder einfach Quotes ergenen wenn man das argv ausgibt. Ja und dafür hätte ich schon gern was fertiges, vor allem weil ich ja nicht all die Parsing Regeln kenne.

    DocShoe schrieb:

    boost::program_options

    argtable

    Danke für den Tip, das schau ich mir mal an.



  • DocShoe schrieb:

    boost::program_options

    argtable

    Du hast gaub ich die Aufgabe nicht verstanden.
    Es geht nicht darum argc, argv auszuwerten.
    Sondern argc, argv aus einem String zu erstellen.





  • Th69 schrieb:

    -> cmd2argv 😉

    Das sieht gut aus, scheint aber leider für POSIX Systeme zu sein. Egal ich hab mir den Parser jetzt selber geschrieben. War aber im Nachhinein interessant zu sehen, dass der Autor von deinem Link das Memorymanagement für die Strings genauso gelöst hat wie ich es in meinem Code getan habe.


Anmelden zum Antworten