Parsen von Argumenten



  • High,

    vielleicht könnt ihr mir schnell mal bei was helfen.
    Abhängig von Parametern die beim Programmaufruf mitgegeben werden, soll mein Programm unterschiedlich arbeiten.
    myprog -l -c liest von stdin
    myproc -l <File> aus einem File.

    Was wäre denn der schnellste Ansatz das auszuwerten.
    Ich würde jetzt einzeln auf argv[1], argv[2] usw zugreifen und jeweils Abfragen, welche Option dort steht, bzw. wenn bei [2] kein -c steht, die File-Variable zum späteren arbeiten abspeichern.

    Danke schonmal.

    Gruß,
    smooth_op



  • Ja und wo ist das Probelm? 😕

    Was soll eigendlich -l machen?

    Ich würde die Argumente char für char lesen, wenn es mit nem - anfängt den/die nächsten buchstaben nehmen und "durchswitchen" ( schließlich soll man auch -lc schreiben dürfen! ) und wenns eben nicht mit - anfängt einfach annehmen dass es ein Dateipfad ist. Error handling bei Widersprüchen und so ned vergessen. 🕶



  • smooth_op schrieb:

    Was wäre denn der schnellste Ansatz das auszuwerten.

    Der schnellste zum Programmieren oder ausführen?

    Ein Ansatz: Bestehende Bibliothek verwenden.



  • VSmith schrieb:

    Ja und wo ist das Probelm? 😕

    Naja, ich finde keine elegante bzw funktionierende Lösung.
    Liegt daran das ich Probleme mit den char const ** habe.
    Habs mehrere Dinge versucht:
    char const *param(argv[2]) und danach *param auslesen ->klappt nicht
    if(argv[2] == "-c") fromfile=true; -> so oder in anderen Variationen (== '-c') wills auch nicht laufen.

    Was soll eigendlich -l machen?

    Garnix, ist vorgabe, deshalb hab ich es drin.

    Ich würde die Argumente char für char lesen, wenn es mit nem - anfängt den/die nächsten buchstaben nehmen und "durchswitchen" ( schließlich soll man auch -lc schreiben dürfen! ) und wenns eben nicht mit - anfängt einfach annehmen dass es ein Dateipfad ist. Error handling bei Widersprüchen und so ned vergessen. 🕶

    Ist es besser direkt auf dem Array zu arbeiten, oder erst zwischenspeichern, wenn ja, wie?

    @asc
    Ausführzeit ist bei dem Umfang meiner Programme ziemlich egal. Eine schöne und kurze Lösung hätte mich gefreut. Boost kommt mir für mein Prob doch etwas zu komplex vor, bzw die Einarbeitungszeit steht in keiner Relation.



  • if ( strcmp(argv[2], "-l") == 0 )
       // blabla
    

    das sind C-Strings
    da kannst du nicht einfach '==' oder so verwenden

    du könntest sie maximal zum richtigen "string" konvertieren und dann so vergleichen...



  • Oh alles klar, das hab ich ganz vergessen.
    Danke!



  • if ( strcmp(atoi(argv[2]), "-l") == 0 )
       // blabla
    


  • Das ist ein -(klein-L), nicht eins. 😉
    Wobei ich eh nur das -c prüfen muss.



  • musst du halt wissen...

    nur so vergleicht man halt die strings



  • Skym0sh0 schrieb:

    musst du halt wissen...

    nur so vergleicht man halt die strings

    Hm, versteh ich nicht. Deine Lösung ist gut und übernommen. War ein Hinweis an Quellcode, weil er dein L als 1 interpretiert hat und ne umwandlung in int vornehmen wollte...



  • zum parsen vonm argumenten nehm ich immer ne eigene klassen den ich alle parameter als liste gebe, und dann nach den elementen als argumente frage
    zudem eine methode setz

    pseudo:

    static int Main(string[] args)
    {
        Arguments arguments = new Arguments();
        foreach(string argument in args)
            arguments.Add(argument);
        if(arguments.OK)
        {
            switch(arguments.Method)
            {
                case "StreamRead":
                    new StreamReader();
                    break;
                case "FileRead":
                    new FileReader(arguments.FileName);
                    break;
            }
        }
        else
            Usage();
        return 0;
    }
    

    StreamRead und FileRead erben von einer gemeinsamen klasse um doppeltes zu vermeiden
    aber ich glaub ich schweife irgendwie ab #gg


Log in to reply