【问题标题】:Why doesn't the null-terminator placed arbitrarily in a string terminate it?为什么任意放置在字符串中的空终止符不会终止它?
【发布时间】:2012-09-18 05:00:56
【问题描述】:

空字符或空终止符 (\0) 用于终止连续的字符序列。我发现在 C 中,我可以将字符添加到随机位置的字符串中,并且字符串将从该点被切断。例如:

char * s = "Hello\0World";

将导致s 等于字符串"Hello"。然而,在 JavaScript 中,情况并非如此:

var s = "Hello\0World";

上述内容无法按预期工作。 s 将等于字符串 "HelloWorld"

为什么这不起作用?

【问题讨论】:

  • 我认为Javascript不是C。所以字符串中的空字节只是字符串中的空字节。
  • 大多数语言都遵循 Pascal 的传统,将字符串表示为具有整数长度的数组(因此允许空字符)。从这个意义上说,C 实际上是奇怪的。

标签: javascript string terminator


【解决方案1】:

C 字符串仍然指向内存中存储“Hello\0World”的地址,只是大多数字符串处理函数会考虑字符串的 0 结尾。对于某些函数,您必须传递一个字符串长度参数,但最简单的是读取直到找到空字节。在内存中,字符串实际上是“Hello\0World\0”。

JavaScript 引擎无法通过查找空字节来确定字符串长度,因为在这种情况下,您将永远无法在字符串中包含空字节。规格中可能有一些关于此的内容。引擎必须单独存储字符串的长度,然后在您访问字符串时从内存中读取那么多字符。

如何正确解析和存储缓冲区的大小是脚本语言通常试图对用户隐藏的东西。这是脚本的一半目的,不需要程序员担心将0添加到创建的字符缓冲区和/或单独存储字符串长度,以便字符串处理函数不会在缓冲区之外打印一堆随机字符以寻找空字节...

那么 JavaScript 字符串究竟是如何表现的呢?我不知道,这可能取决于引擎来深入描述其属性。只要您像规范所说的那样与对象交互,它就可以以任何方式实现,使用结构体作为缓冲区和长度,使用翻译字符作为 0,使用字符链表等......

【讨论】:

    【解决方案2】:

    JavaScript 不使用以 NULL 结尾的字符串,而 C 使用。

    Javascript 字符串是通过单独跟踪字符和长度来存储的,而不是试图假设 NULL 标记字符串的结尾。

    【讨论】:

    • JS 做什么 JS 用于字符串?
    【解决方案3】:

    在 Javascript 中,字符串中的 NULL 字节只是字符串中的 NULL 字节。 如果你想截断字符串

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

    但在这种情况下,我认为它不需要打扰空字节:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-24
      • 2010-11-12
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      相关资源
      最近更新 更多