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_WerteDie 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.
-
Auch wenn dort tatsächlich eine Eins stünde '1', wäre
das nicht dasselbe.(int) '1' == 48 (ASCII-Wert der Ziffer Eins)