Wann/Warum ist ‘\0’ notwendig, um das Ende eines (char) Arrays zu markieren?

Lesezeit: 6 Minuten

Benutzeravatar von Strict
Strikt

Also habe ich gerade ein Beispiel gelesen, wie man ein Array von Zeichen erstellt, die eine Zeichenfolge darstellen.

Das Nullzeichen \0 wird am Ende des Arrays eingefügt, um das Ende des Arrays zu markieren. Ist das notwendig?

Wenn ich ein Char-Array erstellt habe:

char line[100]; 

und setze das Wort:

"hello\n"

Darin würden die Zeichen an den ersten sechs Indizes platziert line[0]line[6]also würde der Rest des Arrays sowieso mit Nullzeichen gefüllt?

Dieses Buch sagt, dass es eine Konvention ist, die zum Beispiel die String-Konstante "hello\n" wird in einem Zeichenarray abgelegt und mit abgeschlossen \0.

Vielleicht verstehe ich dieses Thema nicht ganz und würde mich über Aufklärung freuen.

  • \0 wird verwendet, um das Ende einer Zeichenfolge in C zu markieren. Die meisten Funktionen der C-Std-Bibliothek erfordern, dass die Zeichenfolge auf diese Weise beendet wird, um zu funktionieren.

    – Überstrahlt

    26. November 2016 um 18:12 Uhr

  • Da C nicht weiß, wie lang Ihr String ist, müssen Sie das Ende mit einem \0 markieren, damit es weiß, dass es das Ende Ihres Strings erreicht hat.

    – Cédric Martens

    26. November 2016 um 18:17 Uhr

  • Sie können Pascal-Strings auch in C verwenden. Bestehende Funktionen erwarten dies natürlich nicht, sodass sie nicht zusammenarbeiten.

    – Harald

    26. November 2016 um 18:19 Uhr

  • Mögliches Duplikat von Was ist die Begründung für nullterminierte Zeichenfolgen?

    – Eli Sadoff

    27. November 2016 um 5:23 Uhr

  • Mögliches Duplikat von Muss beim Deklarieren eines Arrays eines Zeichens das Nullzeichen angegeben werden?

    – phuklv

    30. Mai 2018 um 1:59 Uhr

AnT steht mit Russlands Benutzer-Avatar
AnT steht zu Russland

Der \0 Zeichen markiert nicht das “Ende des Arrays”. Der \0 Zeichen markiert das Ende der Schnur in einem Char-Array gespeichert, Wenn (und nur wenn) dieses char-Array eine Zeichenfolge speichern soll.

Ein Char-Array ist nur ein Char-Array. Es speichert unabhängige ganzzahlige Werte (char ist nur ein kleiner ganzzahliger Typ). Ein char-Array muss nicht auf enden \0. \0 hat in einem char-Array keine besondere Bedeutung. Es ist nur ein Nullwert.

Aber manchmal werden char-Arrays zum Speichern verwendet Saiten. Ein String ist eine Folge von Zeichen, die durch beendet wird \0. Also, wenn Sie Ihr char-Array verwenden möchten als Schnur Sie müssen Ihren String mit a abschließen \0.

Also die Antwort auf die Frage nach \0 “notwendig” zu sein, hängt davon ab, was Sie in Ihrem char-Array speichern. Wenn Sie eine speichern Schnurdann müssen Sie es mit a beenden \0. Wenn Sie etwas speichern, das kein String ist, dann \0 hat überhaupt keine besondere Bedeutung.

Benutzeravatar von MayurK
MayurK

‘\0’ ist nicht erforderlich, wenn Sie es als Zeichenarray verwenden. Wenn Sie jedoch ein Zeichenarray als Zeichenfolge verwenden, müssen Sie ‘\0’ eingeben. In C gibt es keinen separaten String-Typ.

Es gibt mehrere Möglichkeiten, ein Zeichenarray zu deklarieren.

Ex:

char str1[]    = "my string";
char str2[64]  = "my string";
char str3[]    = {'m', 'y', ' ', 's', 't', 'r', 'i', 'n', 'g', '\0'};
char str4[64]  = {'m', 'y', ' ', 's', 't', 'r', 'i', 'n', 'g' };

Alle diese Arrays haben dieselbe Zeichenfolge “meine Zeichenfolge”. In str1, str2 und str4 wird das Zeichen „\0“ automatisch hinzugefügt, aber in str3 müssen Sie das Zeichen „\0“ explizit hinzufügen.

(Wenn die Größe eines Arrays explizit deklariert wird und die Initialisiererliste weniger Elemente enthält als die Größe des Arrays, wird die ausruhen des Arrays wird mit so vielen Nullen initialisiert, wie es nötig ist, um es zu füllen — siehe C char Array-Initialisierung und Das Makro N_ELEMENTS .).

Vlad aus Moskaus Benutzer-Avatar
Vlad aus Moskau

Wann/Warum ist ‘\0’ notwendig, um das Ende eines (char) Arrays zu markieren?

Die abschließende Null ist notwendig, wenn ein Zeichen-Array einen String enthält. Dies ermöglicht es, den Punkt zu finden, an dem eine Zeichenfolge endet.

Was Ihr Beispiel betrifft, sieht das meiner Meinung nach folgendermaßen aus

char line[100] = "hello\n";

dann hat für den Anfang das String-Literal 7 Figuren. Es ist eine Zeichenfolge und enthält die abschließende Null. Dieses Zeichenfolgenliteral hat einen Typ char[7]. Das kann man sich gerne vorstellen

char no_name[] = { 'h', 'e', 'l', 'l', 'o', '\n', '\0' };

Wenn ein Zeichenfolgenliteral zum Initialisieren eines Zeichenarrays verwendet wird, werden alle seine Zeichen als Initialisierer verwendet. Relativ zum Beispiel werden also die sieben Zeichen des String-Literals verwendet, um die ersten 7 Elemente des Arrays zu initialisieren. Alle anderen Elemente des Arrays, die nicht mit den Zeichen des String-Literals initialisiert wurden, werden implizit mit Nullen initialisiert.

Wenn Sie bestimmen möchten, wie lange die Zeichenfolge in einem Zeichenarray gespeichert ist, können Sie die Standard-C-Funktion verwenden strlen in der Kopfzeile deklariert <string.h>. Es gibt die Anzahl der Zeichen in einem Array vor der abschließenden Null zurück.

Betrachten Sie das folgende Beispiel

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

int main(void) 
{
    char line[100] = "hello\n";
    
    printf( "The size of the array is %zu"
            "\nand the length of the stored string \n%s is %zu\n",
            sizeof( line ), line, strlen( line ) );
            
    return 0;
}

Seine Ausgabe ist

The size of the array is 100
and the length of the stored string 
hello
 is 6

In C können Sie ein Zeichenfolgenliteral verwenden, um ein Zeichenarray ohne die abschließende Null des Zeichenfolgenliterals zu initialisieren. Zum Beispiel

char line[6] = "hello\n";

In diesem Fall darf man nicht sagen, dass das Array einen String enthält, weil die im Array gespeicherte Folge von Symbolen keine abschließende Null hat.

Sie benötigen das Nullzeichen, um das Ende der Zeichenfolge zu markieren. C speichert keine internen Informationen über die Länge des Zeichenarrays oder die Länge eines Strings, also das Nullzeichen/Byte \0 markiert, wo es endet.

Dies ist nur erforderlich für Saitenjedoch – Sie können jedes gewöhnliche Array von Zeichen haben, das keine Zeichenfolge darstellt.

Probieren Sie zum Beispiel diesen Codeabschnitt aus:

#include <stdio.h>

int main(void) {
    char string[1];
    string[0] = 'a';
    printf("%s", string);
}

Beachten Sie, dass das Zeichenarray vollständig mit Daten gefüllt ist. Somit gibt es kein Null-Byte, um das Ende zu markieren. Jetzt, printf druckt weiter, bis es auf ein Null-Byte trifft – dies wird irgendwo nach dem Ende des Arrays sein, sodass Sie zusätzlich zu „a“ eine Menge Müll ausgeben werden.

Versuchen Sie jetzt Folgendes:

#include <stdio.h>

int main(void) {
    char string[2];
    string[0] = 'a';
    string[1] = '\0';
    printf("%s", string);
}

Es wird nur “a” ausgegeben, da das Ende der Zeichenfolge explizit markiert ist.

Benutzeravatar von wj127
wj127

Die Länge eines C-Strings (ein Array, das die Zeichen enthält und mit einem ‘\0’-Zeichen abgeschlossen wird) wird gefunden, indem nach dem (ersten) NUL-Byte gesucht wird. \0 ist ein Nullzeichen. In C wird es meistens verwendet, um die Beendigung einer Zeichenkette anzuzeigen. Ich mache Ihnen ein Beispiel:

Angenommen, Sie haben ein Wort in eine Datei geschrieben:

word = malloc(sizeof(cahr) * 6);
word = "Hello";
fwrite(word, sizeof(char), 6, fp);

wo drin word Wir weisen Platz für die 5 Zeichen von „Hallo“ plus einen weiteren für das abschließende „\0“ zu. Der fp ist die Datei. Und jetzt schreiben wir ein weiteres Wort nach dem letzten:

word2 = malloc(sizeof(cahr) * 7);
word2 = "world!";
fwrite(word2, sizeof(char), 7, fp);

Lesen wir also jetzt die beiden Wörter:

char buff = malloc(sizeof(char)*1000); // See that we can store as much space as we want, it won't change the final result
/* 13 = (5 chacater from 'Hello')+(1 character of the \0)+(6 characters from 'world!')+(1 character from the \0) */
fread(buff, sizeof(char), 13, fp); // We read the words 'Hello\0' and 'world!\0'
printf("the content of buff is: %s", buff); // This would print 'Hello world!'

Letzteres ist dem Ende geschuldet \0 Charakter, also C weiß, dass es zwei getrennte Zeichenfolgen im Puffer gibt. Wenn wir das nicht gesagt hätten \0 Zeichen am Ende beider Wörter, und wiederholen Sie das gleiche Beispiel, wäre die Ausgabe "Helloworld!"
Dies kann für viele String-Methoden und -Funktionen verwendet werden!.

1444050cookie-checkWann/Warum ist ‘\0’ notwendig, um das Ende eines (char) Arrays zu markieren?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy