Reihenfolge der Kommandozeilenparameter



  • Ich hab das Problem, daß ich ein Programm schreiben muß, welches Kommandozeilenparameter erkennt und auswertet.

    Dies soll mit folgender Syntax geschehen:
    ./prog [-l logdatei] sonstige_Werte

    Die Option -l kann ich mit getopt(argc, argv, "l:") erkennen und weise damit auch gleich darauf hin, daß -l noch einen nachfolgewert haben muss.

    Soweit OK.

    Mein Problem ist jetzt, wie kann ich sicherstellen, daß "-l" als 1. Parameter steht, ohne aufwendig mit if-Bedingungen argv[1] auf -l prüfen zu müssen?
    Gibt es hierfür eine entsprechende Funktion, die mit die Position des Parameters zurückliefert?

    Hier mein bisheriger Code:

    int main (int argc, char **argv) 
    {
    	int opt = getopt(argc,argv, "l:");
    	cout << opt;
    	if ( opt == (int)'l' )
    	{
    
    		cout << "Option l gültig gesetzt! " << opt << "\n";
    	}
    	else
    	{
    		cout << "Aufruf: " << argv[0] << " [-l Logdatei] sonstige_Werte" << endl;
    	}
    }
    


  • boost::program_options ist die Antwort auf alle deine Fragen, zu finden auf www.boost.org



  • Der erste Parameter argc (argument count) speichert die Anzahl der Kommandozeilenparameter, inklusive des Programmnamens!
    Der zweite Parameter char** argv (char* argv[]) enthält immer in argv[0] einen Zeiger auf den Programmnamen.
    Es folgen Zeiger auf die Argumente in der Reienfolge, wie übergeben.
    argv[1] = Zeiger auf erstes Argument argv[2] zweites A. usw. Trennzeichen zwischen den Argumenten sind Leerzeichen.
    Soll ein Leerzeichen nicht als Trennzeichen erkannt werden, muss es in Anführungszeichen gesetzt werden.

    mfg



  • MSJones schrieb:

    /* schnip */
    if ( opt == (int)'l' )
    /* schnip */
    

    Warum machst du denn sowas?

    if ( opt == 1 )
    

    geht doch auch.



  • @imhotep:
    Es wird hier auf den ASCII-Code für l (kleines L) geprüft. wenn ich einfach opt==l mache bekomm ich nen Fehler.

    @Helmut S.:
    Wofür argc und argv stehen war mir schon klar. Aber danke für die Erklärung.

    @Lolz:
    Werd ich mir heut abend mal ansehen! Danke für den Tip.



  • @imhotep

    Auch wenn dort tatsächlich eine Eins stünde '1', wäre
    das nicht dasselbe.

    (int) '1' == 48 (ASCII-Wert der Ziffer Eins)


Log in to reply