programm über befehlszeile?

shrewm

Mitglied
Hallo,
wie kann ich in msvc++ 6.0 ein Programm so schreiben, dass ich Werte über eine Befehlzeile übergeben kann. Also z.B.:
prog.exe -aufgabe wert
So richtig hab ichs nie verstanden :rolleyes:
 
Im allgemeinen macht man dass so:
Code:
int main(int argc, char *argv[]){

argc ist die Anzahl der uebergebenen Argumente, wobei das erste Argument
*argv[0] der Befehlsname selber ist.
 
Beispiel:
Code:
int main(int argc, char* argv[])
{
	if (argc == 2 && (strcmp(argv[1], "/blubb") == 0))
	{
		cout << "Parameter = blubb" << endl;
	}
	return 0;
}
Anzahl der Argumente = 2 (inkl. dem Dateinamen!)
Argument 1 = blubb
 
Hat funktioniert, danke. Aber ich verstehe nicht, wieso
Code:
(strcmp(argv[1], "/blubb")
== 0 sein muss.
Er vergleicht beide Strings, gut, aber wofür die 0?
 
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:
Code:
ac:d:
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.
 
Zuletzt bearbeitet von einem Moderator:
In der Vergangenheit gab es recht viele Bufferoverflows durch eigene erstellte Routinen zur Abfrage der Parameter. Daher wurde diese Funktion mal eingeführt, auch um Standards zu setzen.
Code:
int getopt(int argc, char * const argv[], const char *optstring);
Sollte also von jedem benutzt werden, der Parameter auslesen will.
 
Das in Projekten solche Standards benutz werden ist klar. Jemanden der gerade anfgaengt zu programmieren, sollte man das aber erstmal selber machen lassen.
 
Zurück