
Kennst du das? ./programm datei.txt -v — so übergibt man Argumente direkt beim Programmstart! Mit argc und argv kannst du diese Argumente in C auslesen. Das macht deine Programme echte Kommandozeilen-Tools!
Was sind Kommandozeilenargumente?
Wenn du ein Programm in der Shell startest, kannst du Argumente direkt beim Aufruf mitgeben:
./rechner 10 + 5 ./gruss Ömer ./kopiere quelle.txt ziel.txt
Das Betriebssystem übergibt diese Argumente an dein C-Programm über zwei spezielle Parameter der main-Funktion:
| Parameter | Bedeutung | Typ |
|---|---|---|
| argc | Argument Count – Anzahl der Argumente (immer mindestens 1!) | int |
| argv | Argument Vector – Array von Strings, eines pro Argument | char *argv[] |
Wichtig: Die erweiterte main-Signatur
Statt int main() schreibst du:
int main(int argc, char *argv[])
Beide Formen sind gültig C – du verwendest die erweiterte Form wenn du Argumente brauchst.
Wenn du ./rechner 10 + 5 aufrufst, sieht das argv-Array so aus:
Einfaches Beispiel – Begrüßung
#include <stdio.h> int main(int argc, char *argv[]) { if (argc < 2) { printf("Verwendung: %s Name\n", argv[0]); return 1; } printf("Hallo, %s!\n", argv[1]); return 0; }
String zu Zahl umwandeln: atoi und atof
Alle Argumente in argv sind Strings (Zeichenketten). Wenn du eine Zahl brauchst, musst du konvertieren. Die Funktionen dafür sind in <stdlib.h>:
| Funktion | Konvertierung | Beispiel |
|---|---|---|
| atoi(s) | String → int | atoi("42") → 42 |
| atof(s) | String → double | atof("3.14") → 3.14 |
| strtol(s,NULL,10) | String → long (sicherer!) | Gibt 0 zurück UND setzt Fehler-Flag |
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int n = atoi(argv[1]); // "42" → 42 double d = atof(argv[1]); // "3.14" → 3.14 printf("int: %d, double: %.2f\n", n, d); return 0; }
Achtung: atoi("abc") gibt 0 zurück – kein Fehler!
Wenn der String keine gültige Zahl enthält, gibt atoi einfach 0 zurück. Das kann zu stillen Fehlern führen. Für robuste Programme lieber strtol verwenden.
Argumente validieren
Bevor du auf argv[1], argv[2] etc. zugreifst, immer zuerst argc prüfen! Sonst ist das Verhalten undefiniert (= Absturz).
int main(int argc, char *argv[]) { /* Exakt 3 Argumente erwartet (+ Programmname = argc 4) */ if (argc != 4) { printf("Fehler: Genau 3 Argumente nötig!\n"); printf("Verwendung: %s zahl1 op zahl2\n", argv[0]); return 1; } /* Jetzt sicher auf argv[1], argv[2], argv[3] zugreifen */ return 0; }
Vollständiges Beispiel – Taschenrechner
Aufruf: ./rechner 10 + 5 — alle drei Operanden kommen als Argumente:
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { if (argc != 4) { printf("Verwendung: %s zahl1 op zahl2\n", argv[0]); return 1; } double a = atof(argv[1]); char op = argv[2][0]; // erstes Zeichen des Operator-Strings double b = atof(argv[3]); switch (op) { case '+': printf("%.2f\n", a + b); break; case '-': printf("%.2f\n", a - b); break; case '*': printf("%.2f\n", a * b); break; case '/': if (b != 0) printf("%.2f\n", a / b); else printf("Fehler: Division durch 0!\n"); break; default: printf("Unbekannter Operator: %c\n", op); } return 0; }
Häufige Fehler
Fehler 1: argc nicht prüfen
argv[1] ohne argc >= 2 zu prüfen = undefiniertes Verhalten = Absturz. Immer erst argc prüfen!
Fehler 2: argv[0] vergessen
argv[0] ist der Programmname. Wenn du 2 Argumente erwartest, prüfe argc == 3, nicht argc == 2!
Fehler 3: atoi-Fehler erkennen
atoi("abc") gibt 0 zurück – nicht als Fehler erkennbar. Für kritische Programme strtol verwenden.
Fehler 4: argv modifizieren
argv-Strings sind read-only! Kopiere sie in ein eigenes char-Array wenn du sie verändern willst.
Kommandozeilen-Simulator
Simuliere einen Programmaufruf mit Argumenten. Gib den Programmnamen und Argumente ein, dann sieh wie argc und argv aussehen würden:

Im echten Programm kannst du beim Kompilieren und Starten natürlich echte Argumente übergeben. Der Simulator zeigt dir visuell wie argc/argv befüllt werden.
Taschenrechner simulieren
Unten siehst du den Taschenrechner-Code. Der Simulator berechnet das Ergebnis basierend auf deinen eingegebenen Argumenten:
Quiz – argc und argv
argv[0] immer?argc an?argv?"42" in den int-Wert 42 um?argv[1] zugreift obwohl argc == 1?atoi?argc zurück wenn das Programm ohne Argumente gestartet wird?Spickzettel – argc und argv
Checkliste Unit 34
- Ich kenne die erweiterte main-Signatur mit argc und argv
- Ich weiß dass argv[0] immer der Programmname ist
- Ich kann Strings mit atoi/atof in Zahlen umwandeln
- Ich prüfe immer argc bevor ich auf argv[i] zugreife
- Ich kann einen einfachen Kommandozeilen-Taschenrechner schreiben