A.4 Kommandozeilenargumente
Beim Startup des Programms wird die main()-Funktion aufgerufen. Darauf wurde ja bereits in Abschnitt 7.9, »Die main()-Funktion«, eingegangen. Neben der Möglichkeit, die main()-Funktion wie folgt zu definieren:
int main(void) { /* ... */ }
gibt es auch noch die Möglichkeit, (Kommandozeilen)argumente beim Programmstart an die main()-Funktion zu übergeben. Für diesen Fall können Sie main() so definieren, wie im Folgenden gezeigt.
Damit Sie einem Programm beim Start Argumente übergeben können, wird eine parametrisierte Hauptfunktion benötigt. Ihre Syntax sieht so aus:
int main(int argc, char *argv[]) { /* ... */ }
Die Hauptfunktion main() besitzt hier zwei Parameter mit den Namen argc und argv. Die Bezeichner argc und argv dieser Parameter sind so nicht vorgeschrieben, und Sie können hierzu auch einen beliebigen gültigen Bezeichner verwenden. In der Praxis werden allerdings die beiden Bezeichner argc (für argument counter) und argv (für argument vector) meistens mit diesem Namen verwendet, weil dann auch andere Programmierer, die den Code lesen müssen, schnell erkennen, worum es sich dabei handelt.
Der erste Parameter argc beinhaltet die Anzahl Argumente, die dem Programm beim Start übergeben wurden. Dabei handelt es sich um einen Integer-Wert. Im zweiten Parameter argv stehen die einzelnen Argumente. Diese werden in einem Array von Zeigern auf char gespeichert. Folgendes Beispiel demonstriert dies:
/* argument.c */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
for(int i=0; i < argc; i++) {
printf("argv[%d] = %s ", i, argv[i]);
printf("\n");
}
return EXIT_SUCCESS;
}
Das Listing wurde z. B. unter dem Namen argument.c gespeichert und anschließend übersetzt. Wenn Sie das Programm starten, wird auf dem Bildschirm meistens der Programmname ausgegeben:
$ ./argument
argv[0] = ./argument
Ob argv[0] der Programmname ist, hängt allerdings auch von der Programmumgebung ab. Es ist daher auch möglich, dass argv[0] einfach nur ein Leer-String "" ist.
Starten Sie das Programm jetzt nochmals mit folgender Eingabe von der Kommandozeile (argument sei wieder der Programmname):
$ ./argument Hallo Welt
argv[0] = ./argument
argv[1] = Hallo
argv[2] = Welt
Die einzelnen Argumente, die dem Programm übergeben werden, müssen immer durch mindestens ein Leerzeichen getrennt sein. Wenn Sie z. B. Folgendes eingeben:
$ ./argument HalloWelt
argv[0] = argument
argv[1] = HalloWelt
werden nur noch zwei Argumente ausgegeben, weil zwischen Hallo und Welt kein Leerzeichen mehr war.
Der Parameter int argc zählt die Anzahl der Strings, die dem Programm beim Aufruf mitgegeben wurden. Dazu finden Sie im Folgenden ein Beispiel:
/* arg_counter.c */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
printf("Insgesamt %d Argumente\n", argc-1);
printf("Letztes Argument: %s\n", argv[argc-1]);
return EXIT_SUCCESS;
}
In diesem Beispiel werden die Anzahl der Argumente und das letzte Argument ausgegeben. Es kann nützlich sein, die Anzahl der Argumente zu kennen, wenn Sie ein Programm erstellen, das eine bestimmte Anzahl von Argumenten erfordert.
Falls Sie ein Programm schreiben, das unbedingt eine bestimmte Anzahl Argumente beim Startup benötigt oder erwartet, sollten Sie immer die Anzahl der Argumente überprüfen, damit es nicht zu einer Fehlfunktion kommt. Das folgende Beispiel demonstriert dies:
/* min_args.c */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
if( argc < 2 ) {
fprintf(stderr, "Mind. ein Argument erwartet\n");
return EXIT_FAILURE;
}
else {
printf("Die eingegebenen Argumente:\n");
for(int i = 1; i < argc; i++ ) {
printf("\t %d : %s\n", i, argv[i]);
}
}
return EXIT_SUCCESS;
}