📚 Kapitel 7 · Unit 34 von 36

argc und argv
Kommandozeilenargumente

Argumente einlesen · main-Signatur · atoi / atof · Validierung · Taschenrechner

34 / 36 Units
Ömer
Kapitel 7: Fortgeschrittene Konzepte ~100 Min. Theorie + Simulator + Quiz + Spickzettel
Ömer
Ömer sagt:

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:

terminalSHELL
./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:

ParameterBedeutungTyp
argcArgument Count – Anzahl der Argumente (immer mindestens 1!)int
argvArgument Vector – Array von Strings, eines pro Argumentchar *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:

./rechner 10 + 5  (argc = 4)
argv[0]
"./rechner"
Programmname – immer vorhanden
argv[1]
"10"
erstes Argument
argv[2]
"+"
zweites Argument
argv[3]
"5"
drittes Argument

Einfaches Beispiel – Begrüßung

gruss.cC
#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;
}
./gruss Ömer
Hallo, Ömer!
./gruss (ohne Argument)
Verwendung: ./gruss Name

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>:

FunktionKonvertierungBeispiel
atoi(s)String → intatoi("42") → 42
atof(s)String → doubleatof("3.14") → 3.14
strtol(s,NULL,10)String → long (sicherer!)Gibt 0 zurück UND setzt Fehler-Flag
konvertierung.cC
#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).

validierung.cC
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:

rechner.cC
#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;
}
./rechner 10 + 5
15.00
./rechner 7 / 0
Fehler: Division durch 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:

argc/argv Simulator – Unit 34
Programmname:
Argumente:
– Klicke auf SIMULIEREN –
Ömer
Ömer sagt:

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:

rechner.c – Simulation
▶ Ausgabe
– Klicke auf AUSFÜHREN –

Quiz – argc und argv

Frage 1
Was enthält argv[0] immer?
ADen Programmnamen
BDas erste übergebene Argument
CDen Wert von argc
DNULL
Frage 2
Was gibt argc an?
ANur die Anzahl der übergebenen Argumente (ohne Programmname)
BDie Anzahl aller Argumente inklusive Programmname
CDie Länge des längsten Arguments
DImmer 0 wenn keine Argumente übergeben werden
Frage 3
Welcher Typ hat argv?
Aint[]
Bchar *argv[] (Array von Strings)
Cchar argv
Dvoid *
Frage 4
Welche Funktion wandelt den String "42" in den int-Wert 42 um?
Aatof
Batoi
Cscanf
Dstrlen
Frage 5
Was passiert wenn man auf argv[1] zugreift obwohl argc == 1?
Aargv[1] enthält einen leeren String ""
BCompilerfehler
CUndefiniertes Verhalten – wahrscheinlich Absturz
Dargc wird automatisch erhöht
Frage 6
Welche Bibliothek benötigt man für atoi?
Astdio.h
Bstdlib.h
Cstring.h
Dmath.h
Frage 7
Was gibt argc zurück wenn das Programm ohne Argumente gestartet wird?
A0
B1 (nur der Programmname in argv[0])
C-1
DNULL
Frage 8
Wie prüft man ob genau 2 Argumente (neben dem Programmnamen) übergeben wurden?
Aif (argc == 2)
Bif (argc == 3)
Cif (argc > 2)
Dif (argv[2] != NULL)

Spickzettel – argc und argv

main-Signatur
int main(int argc, char *argv[])erweiterte Form
argcAnzahl inkl. Progname
argv[0]immer Programmname
argv[argc-1]letztes Argument
argc/argv Tabelle
argc == 1nur Programmname
argc == 21 Argument
argc == 32 Argumente
argc == n+1n Argumente
Konvertierung
atoi(argv[1])String → int
atof(argv[1])String → double
argv[2][0]erstes Zeichen
#include <stdlib.h>für atoi/atof
Validierungsmuster
if (argc < 2)mind. 1 Arg. prüfen
if (argc != 4)genau 3 Args prüfen
printf("%s ...", argv[0])Nutzungshinweis
return 1;Fehler-Exitcode

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