Dein erstes C-Programm
Der Aufbau einer .c-Datei: #include, main, printf, Kommentare und Exit-Codes. Plus: die wichtigsten printf-Formatangaben.
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>enthaeltprintf,scanfund 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
\nist 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
| Format | Bedeutung |
|---|---|
%d, %i | int (Ganzzahl) |
%u | unsigned int |
%ld | long int |
%f | double |
%.2f | double mit 2 Nachkommastellen |
%e | exponentielle Schreibweise |
%c | char (einzelnes Zeichen) |
%s | string (char-Array) |
%p | Pointer |
%x | Hexadezimal |
%% | 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;
}
scanfliest eine formatierte Eingabe&alter- das&uebergibt die Adresse vonalter. So kannscanfdort 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?
- Wir reservieren einen Puffer
name[50]auf dem Stack fgetsliest eine Zeile und gibtNULLbei Fehler zurueck- Der Zeilenumbruch
\nam Ende wird entfernt 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>bringtprintf/scanfhereinint main(void) { ... return 0; }ist die Struktur- Format-Specifier wie
%d,%s,%.2finprintf &variablegibt die Adresse - fuerscanfnoetigfgetsist sicherer alsscanffuer Stringsstderrfuer Fehlermeldungen
Im naechsten Kapitel: Variablen, Datentypen und Typen in C.