问题标签 [null-terminated]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
21874 浏览

c++ - std::string 可以包含嵌入的空值吗?

对于常规 C 字符串,空字符'\0'表示数据结束。

怎么样std::string,我可以有一个嵌入空字符的字符串吗?

0 投票
6 回答
3607 浏览

c - 使用 strncpy 将文件逐行复制到 char 数组中

所以我试图逐行读取文本文件并将每一行保存到一个字符数组中。

从循环中的打印输出中,我可以看出它正在正确计算行数和每行的字符数,但我遇到了strncpy. 当我尝试打印数据数组时,它只显示 2 个奇怪的字符。我从未与之合作过,strncpy所以我觉得我的问题可能与空终止有关。

0 投票
5 回答
2984 浏览

c++ - 如何从包含 \0 的字符串中获取 C 字符串而不丢失 \0

我目前有一个非常大的字符串。我需要将其转换为 C 字符串 (char*),因为我要使用的函数仅在参数中采用 C 字符串。

我的问题是,我尝试过的任何事情都会使最终的 C 字符串变得比原始字符串小,因为我的字符串包含许多 \0。那些 \0 是必不可少的,所以我不能简单地删除它们:(...

我尝试了各种方法,但最常见的是:

不幸的是,C 字符串始终只是第一个 \0 之前的原始字符串的内容。

任何帮助将不胜感激!

0 投票
3 回答
2251 浏览

c# - 空终止符是文本编码的一部分吗?

我正在尝试从字节数组中读取以空字符结尾的字符串;该函数的参数是编码。

例如,以下编码中的“foo”是:

如果我将所有字节复制到一个数组中(读取到空终止符)并将该数组传递给encoding.GetString(),它将不起作用,因为如果字符串是 UTF-32 编码的,我的算法将在第二个字节后到达“空终止符” .

所以我有一个双重问题:空终止符是编码的一部分吗?如果不是,我如何逐个字符地解码字符串并检查以下字节是否有空终止符?

提前致谢

(建议也值得赞赏)

编辑:

如果 "foo" 以 null 结尾并以 utf-32 编码,那会是什么?:

0 投票
6 回答
3613 浏览

c++ - gcc 的非空终止字符串编译器选项

更新

原来这只是“c++ is not c blues”的另一种情况


我想要的是

唯一有效的

是否有任何编译器选项或我可以做些什么来使字符串在 gcc 编译器中不为空终止。这样我就可以制作一个(n)常量数组

0 投票
20 回答
29388 浏览

c++ - 空终止字符串的基本原理是什么?

尽管我很喜欢 C 和 C++,但在选择以空字符结尾的字符串时,我不禁摸不着头脑:

  • 长度前缀(即 Pascal)字符串在 C 之前存在
  • 长度前缀字符串通过允许恒定时间长度查找使几种算法更快。
  • 长度前缀字符串使得更难导致缓冲区溢出错误。
  • 即使在 32 位机器上,如果您允许字符串为可用内存的大小,则以长度为前缀的字符串仅比以空字符结尾的字符串宽三个字节。在 16 位机器上,这是一个字节。在 64 位机器上,4GB 是一个合理的字符串长度限制,但即使您想将其扩展到机器字的大小,64 位机器通常有足够的内存,这使得额外的 7 个字节排序为空参数。我知道最初的 C 标准是为极其糟糕的机器编写的(就内存而言),但效率的论点并没有在这里卖给我。
  • 几乎所有其他语言(即 Perl、Pascal、Python、Java、C# 等)都使用长度前缀字符串。这些语言通常在字符串操作基准测试中击败 C,因为它们对字符串更有效。
  • C++ 使用模板稍微纠正了这一点std::basic_string,但期望空终止字符串的纯字符数组仍然普遍存在。这也是不完美的,因为它需要堆分配。
  • 以空结尾的字符串必须保留一个字符(即 null),该字符不能存在于字符串中,而以长度为前缀的字符串可以包含嵌入的空值。

其中一些事情比 C 更近一些,所以 C 不知道它们是有道理的。然而,在 C 出现之前,有几个很简单。为什么会选择以空结尾的字符串而不是明显优越的长度前缀?

编辑:由于有些人在上面的效率点上要求提供事实(并且不喜欢我已经提供的事实),因此它们源于以下几点:

  • 使用空终止字符串的 Concat 需要 O(n + m) 时间复杂度。长度前缀通常只需要 O(m)。
  • 使用空终止字符串的长度需要 O(n) 时间复杂度。长度前缀为 O(1)。
  • Length 和 concat 是迄今为止最常见的字符串操作。在某些情况下,以空结尾的字符串可能更有效,但这种情况发生的频率要低得多。

从下面的答案中,这些是空终止字符串更有效的一些情况:

  • 当您需要切断字符串的开头并需要将其传递给某个方法时。即使您被允许破坏原始字符串,您也不能在恒定时间内使用长度前缀真正做到这一点,因为长度前缀可能需要遵循对齐规则。
  • 在某些情况下,您只是逐个字符地循环遍历字符串,您也许可以节省 CPU 寄存器。请注意,这仅在您没有动态分配字符串的情况下才有效(因为那时您必须释放它,因此必须使用您保存的 CPU 寄存器来保存您最初从 malloc 和朋友那里获得的指针)。

以上都不像长度和连接那样常见。

在下面的答案中还有一个断言:

  • 你需要切断字符串的末端

但这一个是不正确的——空终止和长度前缀字符串的时间相同。(以空结尾的字符串只需在您希望新结尾的位置粘贴一个空值,长度前缀只需从前缀中减去。)

0 投票
12 回答
56158 浏览

c++ - 将非空终止的无符号字符数组复制到 std::string

如果数组是空终止的,这将非常简单:

但是,我想知道复制非空终止unsigned char 数组的最合适方法是什么,如下所示:

变成一个std::string.

有没有办法在不迭代unsigned char 数组的情况下做到这一点?

谢谢你们。

0 投票
2 回答
3883 浏览

delphi - 将 null 终止的内存流转换为 unicode 字符串

在 Delphi XE 中,我正在从剪贴板中捕获 CF_UNICODETEXT 数据。结果是一个以两个空字节结束的流。要获取复制到剪贴板的实际字符串,我需要去除空值。

这个类似的问题包含一个从 TMemoryStream 转换为 Delphi 的 unicode 字符串的好方法:

然而,在我的情况下,这将产生一个包含尾随空值的字符串。我可以通过限制大小来解决这个问题:

...但这感觉很难看,“特殊情况”。我想知道是否有一种更简洁的方式来编写代码,这样以后查看代码的任何人(我!)都不会立即问“为什么从流中删除尾随字符?”

编辑:先发制人的问题的一种方法是添加评论。但是,除此之外呢?

0 投票
3 回答
223 浏览

c - 复制包含空值的字符串

我想在 C (Windows) 中复制一个包含空值的字符串。我需要一个函数来传递缓冲区长度,这样 NULL 字符就没有意义了。我找到了 StringCbCopy 函数,但它仍然停在第一个 NULL 字符处。

0 投票
3 回答
9990 浏览

c++ - std::string 在 C++11 中是否总是以空结尾?

Herb Sutter 在 2008 年在他的网站上发表的一篇文章中说:

出于与并发相关的原因,有一个积极的提议要在 C++0x 中进一步加强这一点,并要求空终止并可能禁止写时复制实现。这是论文:http ://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2534.html 。我认为本文中的一项或两项提案很可能会被采纳,但我们将在下一次或两次会议上看到。

我知道 C++11 现在保证 std::string 内容连续存储,但是他们在最终草案中采用了上述内容吗?

现在使用类似的东西安全&str[0]吗?