Es gibt dazu auch eine sehr elegante Funktion
getopt().
Ich glaub, im C99 Standard ist die Funktion nicht enthalten, aber sie geht zumindest in DevC++ (und natürlich unter Linux
).
Falls du Windows benutzt, findest du hier die man Page dafür:
http://www.cs.duke.edu/courses/spring04/cps108/resources/getoptman.html
Die Anwendung ist sehr einfach:
Der erste Parameter ist argc, der zweite argv. Bekommst du beide an main übergeben.
Der dritte ist eine Stringkonstante und enthält alle gültigen Option.
Falls diese Options auch einen Wert annehmen soll (also
-a foobar), dann muss ein Doppelpunkt der Option folgen.
Beispiel:
Würde die Optionen a, c und d annehmen, und c und d muessen jeweils Parameter haben.
getopt() sortiert auch gleich die Parameter in argv, die nicht zu einer Option gehören, an's Ende, also musst du dich darum nicht mehr kümmern.
Jeder Aufruf von getopt() gibt dir die nächste Option zurück und -1, falls alle Optionen durchgelaufen wurden.
Ein praktisches Beispiel:
Code:
int c;
while ((c = getopt(argc, argv, "ac:d:")) != -1) {
switch (c) {
case 'a':
printf("Flag a an!\n");
break;
case 'c:'
printf("Argument zur Option c: %s\n", optarg);
break;
case 'd':
printf("-d %s\n", optarg);
break;
}
}
Solange opterr nicht auf 0 gesetzt wird, werden automatisch Fehlermeldungen ausgegeben, falls eine Option unbekannt ist, oder kein (falls erfoderlich) Argument hat.
Das Beispielprogramm würde sich folgendermaßen verhalten:
Code:
$ ./prog -a
Flag a an!
$ ./prog -a -d foo
Flag a an!
-d foo
$ ./prog -b
./prog: invalid option -- e
Ist jetzt nicht seh toll erklärt, aber in der man Page steht alles ausführlich drin.
Zu strcmp:
Es wird 0 zurückgegeben, falls die Strings gleich sind, 1, fals der erste größer und -1 falls der zweite String größer ist.