2012-09-26 1 views
7

Das Nullzeichen oder Null-Terminator (\0) soll verwendet werden, um eine zusammenhängende Folge von Zeichen zu beenden. Ich finde, dass ich in C das Zeichen in eine Zeichenfolge an einer zufälligen Position hinzufügen kann, und die Zeichenfolge wird von diesem Punkt abgeschnitten. Zum Beispiel:Warum beendet der Null-Terminator, der willkürlich in einer Zeichenkette platziert wird, ihn?

char * s = "Hello\0World"; 

führt in s"Hello" gleich der Zeichenfolge ist. In JavaScript ist dies jedoch nicht der Fall:

var s = "Hello\0World"; 

Das obige wird nicht wie erwartet funktionieren. s entspricht der Zeichenfolge "HelloWorld".

Warum funktioniert das nicht?

+0

I denke, dass Javascript nicht C ist. Das Null-Byte in einer Zeichenfolge ist also einfach ein Null-Byte in einer Zeichenfolge. –

+1

Die meisten Sprachen folgen der Pascal-Tradition der Darstellung von Strings als Array mit einer Integer-Länge (wodurch das Null-Zeichen zulässig ist). C ist in diesem Sinne eigentlich das Seltsame. – hugomg

Antwort

8

JavaScript verwendet keine NULL-terminierten Strings, während C dies tut.

Javascript-Zeichenfolgen werden gespeichert, indem Sie die Zeichen und die Länge separat verfolgen, anstatt zu versuchen, anzunehmen, dass eine NULL das Ende der Zeichenfolge markiert.

+0

Was * verwendet * JS für Strings? – 0x499602D2

+0

Es trennt sie mit '" '.... – Nanne

2

In Javascript ein NULL Byte in einem String ist einfach ein NULL Byte in einer Zeichenfolge. Wenn Sie kürzen wollen die Zeichenfolge

var s = "Hello\0World".split("\0").shift(); 

aber in diesem Fall halte ich es nicht den Null-Byte stören muß :)

4

Der C-String in Erinnerung an eine Adresse noch Punkte, wo „Hallo \ 0World“ wird gespeichert, nur dass die meisten Funktionen zur Zeichenfolgenverarbeitung 0 Ende der Zeichenfolge berücksichtigen. Für einige Funktionen müssen Sie ein String-Längen-Argument übergeben, aber die meisten lesen Sie einfach, bis sie das Null-Byte finden. Im Speicher ist die Zeichenfolge tatsächlich "Hello \ 0World \ 0".

Eine JavaScript-Engine kann die Zeichenfolgenlänge nicht ermitteln, indem nach einem Nullbyte gesucht wird, da Sie in einem solchen Fall nie ein Nullbyte in einer Zeichenfolge haben könnten. Da ist wahrscheinlich etwas in den Spezifikationen. Die Engine muss stattdessen die Länge der Zeichenfolge separat speichern und diese Zeichen dann aus dem Speicher lesen, wenn Sie auf die Zeichenfolge zugreifen.

Und wie man die Größe von Puffern richtig analysiert und speichert, versuchen Skriptsprachen normalerweise vor dem Benutzer zu verbergen. Das ist der halbe Zweck der Skripterstellung, damit der Programmierer sich keine Gedanken darüber macht, 0 zu den erstellten Zeichenpuffern hinzuzufügen oder die Zeichenfolgenlänge separat zu speichern, damit die Zeichenfolgenfunktionen keine zufälligen Zeichen außerhalb Ihres Puffers ausgeben, um nach einem Nullbyte zu suchen. .

So genau wie verhält sich eine JavaScript-Zeichenfolge? Ich weiß nicht, es liegt wahrscheinlich an der Engine, ihre Eigenschaften in der Tiefe zu beschreiben. Solange Sie mit dem Objekt eine Schnittstelle herstellen, wie es die Spezifikation sagt, kann es auf beliebige Weise implementiert werden, indem Strukturen für Puffer und Länge verwendet werden, ein Übersetzungszeichen für 0 verwendet wird, eine verkettete Liste von Zeichen verwendet wird usw.

Verwandte Themen