Zum Inhalt springen
C Anfรคnger 20 min

Dein erstes C-Programm

Der Aufbau einer .c-Datei: #include, main, printf, Kommentare und Exit-Codes. Plus: die wichtigsten printf-Formatangaben.

Aktualisiert:
Inhaltsverzeichnis

Dein erstes C-Programm

Schauen wir uns ein vollstaendiges C-Programm an und verstehen jedes Detail - Zeile fuer Zeile.

Das minimale Programm

#include <stdio.h>

int main(void) {
    printf("Hallo, C!\n");
    return 0;
}

#include <stdio.h>

#include ist eine Preprocessor-Direktive. Sie sagt dem Compiler: โ€œFuege den Inhalt der Header-Datei stdio.h hier ein.โ€

  • <stdio.h> enthaelt printf, scanf und Co.
  • Systemheader stehen in < >, eigene Header in " "

int main(void)

Jedes C-Programm braucht eine main-Funktion. Sie ist der Einstiegspunkt.

  • int - die Funktion gibt eine Ganzzahl zurueck (Exit-Code)
  • main - der Name ist festgelegt
  • (void) - keine Parameter. Kann auch (int argc, char *argv[]) sein, dazu spaeter

printf("...");

printf ist der print formatted-Befehl fuer Konsolenausgabe.

  • Der String wird ausgegeben
  • \n ist der Zeilenumbruch (Escape-Sequenz)
  • Am Ende Semikolon - jede Anweisung endet mit ;

return 0;

Gibt den Exit-Code zurueck:

  • 0 = Erfolg
  • alles andere = Fehler

Kompilieren und starten

gcc hallo.c -o hallo
./hallo

Ausgabe:

Hallo, C!

Variablen und printf

#include <stdio.h>

int main(void) {
    int alter = 28;
    double pi = 3.14159;
    char initial = 'A';

    printf("Alter: %d\n", alter);
    printf("Pi: %.2f\n", pi);
    printf("Initial: %c\n", initial);
    return 0;
}

Ausgabe:

Alter: 28
Pi: 3.14
Initial: A

printf-Formatangaben

FormatBedeutung
%d, %iint (Ganzzahl)
%uunsigned int
%ldlong int
%fdouble
%.2fdouble mit 2 Nachkommastellen
%eexponentielle Schreibweise
%cchar (einzelnes Zeichen)
%sstring (char-Array)
%pPointer
%xHexadezimal
%%ein Prozent-Zeichen

Wichtig: Der Format-String muss zu den Argumenten passen - ein Fehler hier kann undefined behavior sein. Compiler-Warnungen (-Wall) helfen dabei!

Nutzereingabe mit scanf

#include <stdio.h>

int main(void) {
    int alter;
    printf("Dein Alter: ");
    scanf("%d", &alter);
    printf("Mit %d Jahren hast du noch viel vor!\n", alter);
    return 0;
}
  • scanf liest eine formatierte Eingabe
  • &alter - das & uebergibt die Adresse von alter. So kann scanf dort hineinschreiben.

Strings lesen - Vorsicht!

char name[50];
scanf("%49s", name);   // maximal 49 Zeichen (plus Null-Terminator)

Ohne die Laengen-Angabe %49s riskierst du einen Buffer-Overflow. Alternativ fgets:

char zeile[100];
fgets(zeile, sizeof(zeile), stdin);

fgets ist die sicherere Variante und liest die ganze Zeile.

Kommentare

// Einzeiliger Kommentar (seit C99)

/*
 Mehrzeiliger Kommentar
 (immer unterstuetzt)
 */

Zurueck zum main

Mit Kommandozeilenargumenten:

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("Anzahl Argumente: %d\n", argc);
    for (int i = 0; i < argc; i++) {
        printf("  argv[%d] = %s\n", i, argv[i]);
    }
    return 0;
}

Aufruf:

./programm hallo welt 42
# Anzahl Argumente: 4
#   argv[0] = ./programm
#   argv[1] = hallo
#   argv[2] = welt
#   argv[3] = 42

Ein komplettes Beispiel

#include <stdio.h>
#include <string.h>

int main(void) {
    char name[50];

    printf("Wie heisst du? ");
    if (fgets(name, sizeof(name), stdin) == NULL) {
        fprintf(stderr, "Fehler beim Lesen\n");
        return 1;
    }

    // Zeilenumbruch entfernen
    size_t len = strlen(name);
    if (len > 0 && name[len - 1] == '\n') {
        name[len - 1] = '\0';
    }

    printf("Hallo, %s!\n", name);
    return 0;
}

Was passiert hier?

  1. Wir reservieren einen Puffer name[50] auf dem Stack
  2. fgets liest eine Zeile und gibt NULL bei Fehler zurueck
  3. Der Zeilenumbruch \n am Ende wird entfernt
  4. fprintf(stderr, ...) schreibt auf den Fehler-Kanal

Die zwei Ausgabekanaele

  • stdout - Standardausgabe (meist Terminal)
  • stderr - Fehlerausgabe (auch Terminal, aber getrennt umleitbar)
printf("Normal\n");
fprintf(stderr, "Fehler!\n");

Praktisch im Shell:

./programm > log.txt 2> fehler.txt

Zusammenfassung

  • #include <stdio.h> bringt printf/scanf herein
  • int main(void) { ... return 0; } ist die Struktur
  • Format-Specifier wie %d, %s, %.2f in printf
  • &variable gibt die Adresse - fuer scanf noetig
  • fgets ist sicherer als scanf fuer Strings
  • stderr fuer Fehlermeldungen

Im naechsten Kapitel: Variablen, Datentypen und Typen in C.

Zurรผck zum C Kurs