Почему нуль-терминатор, произвольно помещенный в строку, не завершает ее?

Нулевой символ или нуль-терминатор (\0) должен использоваться для завершения непрерывной последовательности символов. Я обнаружил, что в C я могу добавить символ в строку в произвольном месте, и строка будет обрезана с этой точки. Например:

char * s = "Hello\0World";

приведет к тому, что s будет равно строке "Hello". Однако в JavaScript это не так:

var s = "Hello\0World";

Вышеупомянутое не будет работать должным образом. s будет равно строке "HelloWorld".

Почему это не работает?


person 0x499602D2    schedule 26.09.2012    source источник
comment
Я думаю, что Javascript — это не C, поэтому нулевой байт в строке — это просто нулевой байт в строке.   -  person Luca Rainone    schedule 26.09.2012
comment
Большинство языков следуют традиции Паскаля по представлению строк в виде массива целочисленной длины (что позволяет использовать нулевой символ). C на самом деле лишний в этом смысле.   -  person hugomg    schedule 26.09.2012


Ответы (3)


JavaScript не использует строки с завершением NULL, в отличие от C.

Строки Javascript сохраняются путем отдельного отслеживания символов и длины вместо того, чтобы пытаться предположить, что NULL отмечает конец строки.

person loganfsmyth    schedule 26.09.2012
comment
Что использует JS для строк? - person 0x499602D2; 26.09.2012

Строка C по-прежнему указывает на адрес в памяти, где хранится «Hello\0World», только большинство функций обработки строк считают 0 концом строки. Для некоторых функций вы должны передать аргумент длины строки, но большинство из них просто читаются, пока не найдут нулевой байт. В памяти строка на самом деле "Hello\0World\0".

Механизм JavaScript не может определить длину строки, ища нулевой байт, поскольку в таком случае вы никогда не сможете иметь нулевой байт внутри строки. Возможно, что-то об этом есть в характеристиках. Вместо этого движок должен хранить длину строки отдельно, а затем считывать столько символов из памяти всякий раз, когда вы обращаетесь к строке.

А как правильно анализировать и сохранять размер буферов — это то, что языки сценариев обычно пытаются скрыть от пользователя. Это половина цели написания сценариев, чтобы не требовать от программиста беспокойства о добавлении 0 в созданные буферы символов и или отдельном сохранении длины строки, чтобы функции обработки строк не печатали кучу случайных символов за пределами вашего буфера в поисках нулевого байта. .

Так как же ведет себя строка JavaScript? Я не знаю, вероятно, движок должен подробно описать свои свойства. Пока вы взаимодействуете с объектом, как указано в спецификации, его можно реализовать любым способом, используя структуры для буфера и длины, используя символ перевода для 0, используя связанный список символов и т. д.

person sapht    schedule 26.09.2012

В Javascript NULL байт в строке — это просто NULL байт в строке. Если вы хотите обрезать строку

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

но в этом случае я думаю, что не нужно беспокоить нулевой байт :)

person Luca Rainone    schedule 26.09.2012