it-swarm.com.de

Was ist ein "Null Terminated String"?

Ich habe gerade angefangen, C++ zu lesen, und bin auf einen Begriff "Null Terminated String" gestoßen. Ich habe darüber gelesen, konnte aber nicht verstehen, wofür er eigentlich steht.

Ich möchte auch wissen, was der Unterschied zwischen einem C-String (auch als "Null terminated String" bezeichnet) und einem C++ - String ist.

6
user1606191

Kurze Antwort: Eine nullterminierte Zeichenfolge ist ein Zeichenarray mit einem Nullwert (0x00) nach dem letzten gültigen Zeichen in der Zeichenfolge.


Lange Antwort:

Es ist wichtig zu beachten, dass nicht jeder C- und C++ - Compiler Werte für Sie initialisiert. AFAIK, die meisten nicht.

Eine einfache Zeichenfolge in C oder C++ (ohne STL) ist einfach ein Array von Zeichen.

char myString[25];

Zu diesem Zeitpunkt haben wir keine Ahnung , was sich in dieser Zeichenfolge befindet. Es könnte leer sein; es könnte Müllzeichen haben (höchstwahrscheinlich); oder es könnte aussagekräftige Informationen haben. Es hängt alles davon ab, was sich in diesem Speichersegment befand, bevor das Array deklariert wurde.

Beachten Sie, dass wir hier 24 Zeichen Speicher haben und die Null das 25. Zeichen nimmt.

Es ist üblich, eine Zeichenfolge mit Nullen vorab zu füllen und zu löschen, um den Müll zu beseitigen.

memset(myString, 0x00, 25);

Beachten Sie, dass ich in diesem Fall eine hexadezimale Deklaration von 0 verwende, um NULL anzuzeigen. Einige Compiler und/oder Bibliotheken haben einen NULL Wert oder ähnliches definiert.

Viele der grundlegenden Zeichenfolgenfunktionen wie strcmp, strcat usw. basieren auf nullterminierten Zeichenfolgen, um das Ende der Zeichenfolge anzugeben. Wenn Sie es nicht beendet haben, kann die Zeichenfolgenfunktion am Ende der Zeichenfolge ausgeführt werden und nicht wie erwartet funktionieren.

Die C++ STL-Zeichenfolge ist ein tatsächliches Objekt und kümmert sich um einige dieser Initialisierungs-/Beendigungsprobleme für Sie.

16
user53019

Bei der Computerprogrammierung ist eine nullterminierte Zeichenfolge eine Zeichenfolge, die als Array mit den Zeichen gespeichert und mit einem Nullzeichen ('\ 0', in ASCII NUL genannt) abgeschlossen wird.

http://en.wikipedia.org/wiki/Null-terminated_string

12
Pieter B

Es gibt einige ausgezeichnete Antworten in diesem Thread, aber ich möchte eine hinzufügen, die für eine Person gedacht ist, die Computerprogrammierung ausgehend von einer stark typisierten Sprache wie Java oder C #) gelernt und nie programmiert hat eine schwach typisierte Sprache wie C oder C++.

(Beachten Sie, dass ich über starkes oder schwaches Tippen spreche, nicht über dynamisches oder statisches Tippen. Die genaue Definition von schwachem Tippen ist eine faszinierende Diskussion für sich, aber außerhalb des Rahmens dieser Antwort :)

Um nullterminierte Zeichenfolgen zu verstehen, müssen wir damit beginnen, wie die Daten in schwach typisierten Systemen gespeichert werden. In diesen Systemen ist der gesamte Speicher nur eine große Folge von Bytes, und das Programm hat jederzeit Zugriff auf eines dieser Bytes. Es ist Sache des Programms, die Bytes richtig zu interpretieren. Wenn das Programm beispielsweise eine 32-Bit-Ganzzahl an der Adresse A1 lesen muss, liest es 4 Bytes ab der Adresse A1 und interpretiert sie als einzelne 32-Bit-Ganzzahl. Es ist bekannt, dass die 32-Bit-Ganzzahl 4 Byte groß ist, sodass keine Markierung für die Endung der Ganzzahl erforderlich ist.

Dies gilt nicht für Textzeichenfolgen, die in den meisten Sprachen eine beliebige Größe haben können und durch ein einzelnes Byte pro Zeichen (oder 2 Byte für UNICODE-Zeichenfolgen) dargestellt werden. Die Kenntnis der Startadresse eines Strings bedeutet also nicht, dass das Programm weiß, wo der String endet. Denken Sie daran - in schwach typisierten Sprachen hindert nichts das Programm daran, den Speicher über das Ende der Zeichenfolge hinaus zu lesen, und interpretiert die Bytes, die die hinter der Zeichenfolge gespeicherten Daten darstellen, weiterhin als weitere Zeichen.

Um eine Textzeichenfolge an der Adresse A2 lesen zu können, muss das Programm wissen, wie lang die Zeichenfolge ist, damit es weiß, wie viele Bytes es lesen soll. Einige Sprachen werden damit umgehen, indem sie die Größe der Textzeichenfolge im ersten Byte (oder 2 oder sogar 4 Bytes) speichern. Ein String "foo" kann 4 Bytes lang sein und so aussehen:

3 102 111 111

dabei ist 3 die Länge der Zeichenfolge und 102 und 111 ASCII Codes für die Zeichen 'f' und 'o'. Dies ist ziemlich einfach, begrenzt jedoch die maximale Länge einer Zeichenfolge in In diesem Fall sind es 255 Zeichen (da 255 der maximale ganzzahlige Wert ist, der in einem einzelnen Byte gespeichert werden kann, haben wir die Länge der Zeichenfolge beibehalten).

Eine andere Möglichkeit, mit diesem Problem umzugehen, besteht darin, das Ende der Zeichenfolge zu markieren. Dies ist genau das, was eine nullterminierte Zeichenfolge tut. Es wird ein NULL-Zeichen verwendet, das durch ASCII Wert von 0 (Null)) dargestellt wird. Die gleiche Zeichenfolge "foo" könnte also folgendermaßen aussehen:

102 111 111 0

Beachten Sie, dass in diesem Fall die Länge einer Zeichenfolge, die in diesem Format dargestellt werden kann, unbegrenzt ist und der Overhead der Darstellung immer genau ein Byte beträgt (die endgültige Null). Offensichtlich können Textzeichenfolgen, die das Zeichen NULL enthalten, überhaupt nicht als nullterminierte Zeichenfolgen dargestellt werden.

Nullterminierte Zeichenfolgen sind in den meisten anderen Sprachen nicht mit Zeichenfolgen vergleichbar. Sie sind die Standardmethode zur Darstellung von Zeichenfolgen in C, da es sich lediglich um ein Array von Zeichen in sequentieller Reihenfolge handelt. In einer Sprache wie C++ ist eine Zeichenfolge ein tatsächliches Objekt mit Parametern und Dingen.

Das Problem mit dieser Zeichenfolge ist, woher wissen Sie, wann Sie mit dem Lesen aufhören müssen und wo sich das Ende der Zeichenfolge befindet? Da das Nullzeichen für nichts anderes verwendet wird, wird es zum Beenden der Zeichenfolge verwendet, d. H. Zum Markieren des Endpunkts.

2
Joe Z.

Um die zweite Frage zuerst zu beantworten, ist ein C++ - String eine Instanz der Klasse std::string, Die Teil der C++ - Standardbibliothek ist.
Eine C-Zeichenfolge (oder eine Zeichenfolge im C-Stil oder eine NUL-terminierte Zeichenfolge) ist eine Folge von Zeichen, die mit dem ersten Zeichen '\0' (ASCII NUL) endet.

Ein wichtiger Unterschied besteht darin, dass ein std::string Eingebettete NUL-Zeichen in seinem Inhalt enthalten kann, eine Zeichenfolge im C-Stil jedoch per Definition nicht (da sie am ersten NUL-Zeichen endet).

Der Begriff "NUL-terminierte Zeichenfolge" (häufig als nullterminiert "falsch geschrieben") ergibt sich aus der Tatsache, dass eine solche Zeichenfolge mit einem NUL-Zeichen ('\0') Endet (durch dieses beendet wird).

Eine nullterminierte Zeichenfolge ist eine Folge von Zeichen mit einem nachgestellten Zeichen mit dem Wert 0. Ein String wie "Hi" Wird also als Sequenz {72, 105, 0} (ASCII) dargestellt. Die 0 ist ein Sentinel-Wert, der das Ende der Zeichenfolge angibt. Die Funktionen der C-String-Bibliothek (strcmp, strcpy usw.) hängen vom Vorhandensein dieses 0-Bytes ab, um ordnungsgemäß zu funktionieren.

Dies unterscheidet sich von Pascal- oder Old-School-BASIC-Zeichenfolgen, bei denen die Zeichenfolgenlänge im führenden Byte gespeichert wurde ({2, 72, 105}).

In C werden Zeichenfolgen in Arrays von char gespeichert.

Die C++ string -Klasse verwendet nullterminierte Zeichenfolgen unter der Haube (zumindest in den mir bekannten Implementierungen), aber ihre Benutzeroberfläche ist so, dass Sie sich normalerweise nicht um diese Detailstufe kümmern müssen.

1
John Bode