Der Null-Terminator
Teil des Abschnitts Logic & Flow der C-Journey von Coddy — Lektion 13 von 63.
Sie haben gelernt, dass Strings in C Zeichen-Arrays sind, aber es gibt ein entscheidendes Detail, damit sie richtig funktionieren: Jeder C-String muss mit einem speziellen Zeichen enden, das als Null-Terminator bezeichnet wird, geschrieben als \0.
Der Null-Terminator ist ein Zeichen mit dem ASCII-Wert Null, das das Ende einer Zeichenfolge markiert. Ohne ihn wüssten Funktionen wie printf nicht, wo Ihre Zeichenfolge endet, und würden so lange weiter Speicher auslesen, bis sie zufällig auf ein Null-Byte stoßen, was oft zu unbrauchbaren Ausgaben führt.
char word[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
// Das \0 sagt C: "Der String endet hier"Wenn Sie einen String mit einem Literal wie "Hello" initialisieren, fügt C automatisch den Null-Terminator für Sie hinzu. Aber wenn Sie einen String manuell Zeichen für Zeichen aufbauen, müssen Sie daran denken, \0 am Ende hinzuzufügen.
Dieser Null-Terminator ist der Grund, warum ein Wort mit 5 Zeichen wie „Hello“ ein Character-Array mit 6 Elementen benötigt – ein zusätzlicher Platz für das \0. Das Verständnis dieses Konzepts ist essenziell, da es die Grundlage dafür ist, wie alle C-String-Funktionen bestimmen, wo Strings beginnen und enden.
Aufgabe
EinfachSchreiben Sie ein C-Programm, das das Erstellen und Arbeiten mit Strings durch manuelle zeichenweise Initialisierung mit ordnungsgemäßer Nullterminierung demonstriert. Ihr Programm sollte:
- Ein Zeichen-Array namens
namemit genau 5 Elementen deklarieren - Das
nameArray manuell Zeichen für Zeichen initialisieren, um "John" mit ordnungsgemäßer Nullterminierung zu buchstabieren:- Erstes Element: 'J'
- Zweites Element: 'o'
- Drittes Element: 'h'
- Viertes Element: 'n'
- Fünftes Element:
'\0'(Nullterminator)
- Ein zweites Zeichen-Array namens
citymit genau 7 Elementen deklarieren - Das
cityArray manuell Zeichen für Zeichen initialisieren, um "Boston" mit ordnungsgemäßer Nullterminierung zu buchstabieren:- Verwenden Sie einzelne Zeichenzuweisungen für 'B', 'o', 's', 't', 'o', 'n' und
'\0'
- Verwenden Sie einzelne Zeichenzuweisungen für 'B', 'o', 's', 't', 'o', 'n' und
- Beide Strings mit
printfund dem Formatspezifizierer%sausgeben - Demonstrieren, was ohne Nullterminierung passiert, indem Sie ein drittes Zeichen-Array namens
testmit 4 Elementen erstellen - Initialisieren Sie
testnur mit den Zeichen 'A', 'B', 'C', 'D' (kein Nullterminator) - Geben Sie das
testArray mit%saus, um eine unvorhersehbare Ausgabe zu zeigen
Ihre Ausgabe sollte die Ergebnisse im folgenden Format anzeigen:
Name: John
City: Boston
Test without null terminator: ABCD[unpredictable characters]Diese Herausforderung testet Ihr Verständnis der manuellen String-Konstruktion, die entscheidende Bedeutung des Nullterminators '\0' in C-Strings und wie printf mit %s darauf angewiesen ist, den Nullterminator zu finden, um zu wissen, wo der String endet.
Spickzettel
C-Strings sind Zeichen-Arrays, die mit einem Null-Terminator \0 enden müssen, um das Ende des Strings zu markieren.
Der Null-Terminator hat den ASCII-Wert Null und teilt Funktionen wie printf mit, wo der String endet:
char word[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
// Das \0 teilt C mit: "Der String endet hier"Bei der Verwendung von String-Literalen wie "Hello" fügt C automatisch den Null-Terminator hinzu. Beim Erstellen von Strings Zeichen für Zeichen müssen Sie \0 manuell hinzufügen.
Ein String benötigt ein zusätzliches Array-Element für den Null-Terminator – "Hello" (5 Zeichen) erfordert ein Array mit 6 Elementen.
Probier es selbst
#include <stdio.h>
int main() {
// TODO: Schreiben Sie hier Ihren Code
// Deklarieren und initialisieren Sie die Zeichen-Arrays wie angegeben
// Ergebnisse ausgeben
return 0;
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logic & Flow
1Zeiger-Grundlagen
Was ist ein Zeiger?Zeiger deklarierenDer Adressoperator (&)Der Dereferenzierungsoperator (*)NULL-ZeigerZusammenfassung: Zeiger-Grundlagen4Projekt: Einfaches Text-Tool
ProjektübersichtZeichen zählen2Pointer und Arrays
Array-Namen als PointerArray-Elemente - PointerPointer-ArithmetikPointer vergleichenWiederholung: Array-Durchlauf mit Pointern5Zeiger und Funktionen
Wertübergabe (Pass-by-Value)Zeiger an Funktionen übergebenVariablen über Zeiger ändernEin klassisches Beispiel: SwapArrays an Funktionen übergebenZusammenfassung: Zeiger als Funktionsargumente8Structs und Zeiger
Zeiger auf StructsDer Pfeiloperator (->)Structs per Wert übergebenÜbergabe von Struct-ZeigernDynamische Allokation von StructsZusammenfassung: Struct ändern - Ptr11Finale Wiederholungsaufgaben
Wiederholung: Dynamische String-KonkatenationWiederholung: Array von StructsWiederholung: Wortfrequenz-Zähler3Character-Arrays und Strings
Strings als char-ArraysDer Null-TerminatorString-Eingabe mit scanfVerwendung von strlen()Verwendung von strcpy()Verwendung von strcat()Verwendung von strcmp()Zusammenfassung: Grundlegende String-Funktionen