📘 Kapitel 5 · Arrays & Strings

Strings in C
(char-Arrays)

Nullzeichen \0 · Deklaration · scanf/printf mit %s

23 / 30 Units
Ömer
Kapitel 5: Arrays & Strings ~45 Min. Theorie + Simulator + Quiz + Spickzettel
Ömer
Ömer sagt:

Strings in C sind char-Arrays mit einem speziellen Abschlusszeichen: dem Nullzeichen '\0'. Ohne es weiß C nicht, wo der String endet!

String = char-Array + \0

"Hallo" im Speicher
H
[0]
a
[1]
l
[2]
l
[3]
o
[4]
\0
[5]
strings.cC
char name[20] = "Hallo";       // Deklaration
printf("%s\n", name);          // Ausgabe
scanf("%s", name);             // Einlesen – KEIN &

⚠️ Wichtige Regeln

Array-Größe = Länge + 1 (für \0)
scanf("%s") ohne &
Zuweisung mit strcpy, nicht =
Vergleich mit strcmp, nicht ==

Der Null-Terminator \0

Jeder String in C endet mit dem Nullzeichen \0 (ASCII-Wert 0). C-Funktionen wie printf und strlen suchen nach diesem Zeichen um zu wissen, wo der String endet.

Index012345
ZeichenHallo\0
Bytes72971081081110

Der String "Hallo" hat 5 Buchstaben, braucht aber 6 Bytes im Speicher – den letzten für \0.

nullterm.cC
char name[5] = "Hallo";  // FALSCH! Kein Platz für \0
char name[6] = "Hallo";  // RICHTIG: 5 Zeichen + \0

⚠️ Immer +1 für \0 einplanen!

Für einen String der Länge n braucht man ein char-Array der Größe n+1. Fehlt der Platz für \0, liest C unkontrolliert weiter im Speicher – undefiniertes Verhalten!

Deklarationsformen

deklaration.cC
char s1[20] = "Hallo";    // Array, veränderbar, mit \0
char s2[] = "Welt";       // Größe auto (5 Bytes: W,e,l,t,\0)
char *s3 = "Konstant";    // Pointer auf Literal – NICHT veränderbar!

s1[0] = 'h';   // OK – s1 ist ein Array im Stack
s3[0] = 'k';   // GEFÄHRLICH – Literal liegt im Read-only-Speicher!
FormVeränderbar?GrößeTypischer Einsatz
char s[20] = "..."JaFest (20 Bytes)Benutzereingaben, Verarbeitung
char s[] = "..."JaAutomatisch (Länge+1)Feste Texte die geändert werden
char *s = "..."Nein (read-only!)Pointer (8 Bytes)Konstante Texte, niemals schreiben

⚠️ char *s ist read-only!

char *s3 = "Konstant" zeigt auf ein String-Literal im Read-only-Speicher. Schreiben auf s3[i] führt zu undefiniertem Verhalten oder Absturz. Für veränderbare Strings immer char s[N] verwenden!

scanf vs fgets

scanf("%s")fgets()
LeerzeichenStoppt bei LeerzeichenLiest Leerzeichen mit
PufferüberlaufGefährlich (keine Größenprüfung)Sicher (Größe angeben)
ZeilenumbruchIgnoriert \nSpeichert \n mit im String
EmpfehlungFür einzelne WörterFür ganze Sätze / sicheres Einlesen
eingabe.cC
char name[50];

// Variante 1: scanf – stoppt bei Leerzeichen
scanf("%s", name);           // "Max Mustermann" → nur "Max"

// Variante 2: fgets – liest ganze Zeile (sicher)
fgets(name, sizeof(name), stdin); // "Max Mustermann\n"

Häufige Fehler

FehlerProblemLösung
char s[5]; scanf("%s",s);Buffer Overflow – Eingabe länger als ArrayArray groß genug wählen oder scanf("%4s", s)
if (s1 == s2)Vergleicht Speicheradressen, nicht den Inhalt!if (strcmp(s1, s2) == 0)
char s[5]; s[0]='H'; s[1]='i';Fehlendes \0 am Ende – printf liest zu weits[2] = '\0'; nicht vergessen

⚡ Code-Simulator

Teste Array- und String-Operationen direkt im Browser:

C Simulator – Unit 23
▶ Ausgabe
– Klicke AUSFÜHREN –
Ömer
Ömer sagt:

Ändere die Array-Werte oder den Code und beobachte die Ausgabe. So lernt man Arrays am besten!

🎯 Wissens-Quiz

Frage 1
Welches Zeichen beendet einen String in C?
A'.'
B'#'
C'\\0'
D'\\n'
Frage 2
Wie groß muss char s[] für 'Hi' mindestens sein?
A2
B3
C4
DBeliebig
Frage 3
Welches ist der korrekte scanf-Aufruf für einen String?
Ascanf("%s", &name);
Bscanf("%s", name);
Cscanf("%c", name);
Dscanf(name, "%s");
Frage 4
Was liest scanf("%s") ein?
ADie gesamte Zeile
BNur einen Buchstaben
CAlles bis zum Leerzeichen
DNichts
Frage 5
Wie weist man String b dem String a korrekt zu?
Aa = b;
Ba == b;
Cstrcpy(a, b);
Da[0] = b;
Frage 6
Was ist der Null-Terminator und wozu dient er?
AEin Leerzeichen am Ende des Strings
BDer erste Buchstabe eines Strings
CEin Steuerzeichen für Zeilenumbrüche
D\0 (ASCII 0) markiert das Ende eines Strings
Frage 7
Was ist der Unterschied zwischen char s[] und char *s bei String-Literalen?
As[] ist veränderbar, *s zeigt auf ein Literal (read-only)
BBeide sind identisch
C*s ist veränderbar, s[] ist read-only
Dchar *s ist kein gültiger String
Frage 8
Welche Funktion liest einen ganzen Satz mit Leerzeichen ein?
Ascanf("%s", s)
Bgetchar()
Cfgets(s, SIZE, stdin)
Dputs(s)

📋 Spickzettel

String-Regeln
char s[n+1]Platz für \0!
scanf("%s",s)Ohne & bei Strings
printf("%s",s)Ausgabe
s[i]!='\\0'Schleife bis Ende
Häufige Fehler
s = "Hi"→ strcpy(s,"Hi")
if(a==b)→ strcmp(a,b)==0
char s[5]="Hallo"Kein Platz für \0!
scanf ohne %sPufferfehler

✅ Checkliste Unit 23

  • Ich weiß dass Strings char-Arrays mit \0 sind
  • Ich deklariere Strings mit ausreichender Größe
  • Ich nutze scanf/printf korrekt für Strings
  • Ich kann einen String zeichenweise lesen