字符串中的空值终止符

3

是的,我查看了其他帖子并得出了结论。 我只是想让你确认一下,以便我没有任何误解。

Java字符串对象没有空终止符。

C ++ std :: string对象也没有空终止符。

C字符串或C风格字符串(字符数组)是唯一以空终止符结尾的字符串。

正确还是不正确?

7个回答

5

1
@iwolf:实际上,自C++11以来就不行了。 - Deduplicator
1
@rici:无论如何我都会忍受它。而且,我让它变得非常正确,令人发狂。 - Deduplicator

2

这些说法本身都是正确的,但有点小题大作:C风格字符串不仅仅在C语言中存在,在其他地方也会出现(最常见的是各种形式的汇编代码,而且C语言最初被设计为“略高于汇编语言”,因此这并不让人感到意外)。

而且在C++11中,std::string保证在实际字符串字符后面有一个NUL终止符[但如果您愿意,可以将NULL字符存储在字符串中](至少如果调用c_str(),但在我看过的实现中,它在创建/更新时存储在那里)


1
所有的陈述都不是错的,但需要更详细地澄清每种语言中提到的具体内容。

谢谢。这话从你嘴里说出来,意义非凡。 - B-Mac
2
实际上,他们不是。 - Deduplicator
所有的声明都太模糊了。 - Prikso NAI
@去重器:为什么,伙计? - B-Mac
1
@Grendan:请看我的回答。 - Deduplicator

1
这是正确的,c++的std::string和java的String都有私有字段来表示字符串的长度。不需要使用NULL终止符。 std::string方法c_str返回一个以NULL结尾的char数组,用于需要NULL终止符的情况,例如c字符串函数,如strlen

0

几乎正确。

  • C字符串不仅仅是字符数组。它们是一个以空字符结尾的字符数组。

    因此,如果您有一个字符数组,它还不是C字符串,它只是普通的字符数组。它必须有一个终止的空字符才能成为有效的C风格字符串。

  • 此外,自C++11起,std::string也必须以空字符结尾。(但它仍然有一个私有变量来保存字符串的长度。)


感谢澄清。我爱你。 - B-Mac
@zenith:自C++11以来,它必须以0结尾。 - Deduplicator
@ Deduplicator 哦,这对我来说是个新闻。谢谢。已经相应地进行了编辑。 - emlai

0

我不了解Java部分,但在C++11中,std::string是以NUL结尾的(除了存储字符计数之外),即&s[0]返回与s.c_str()相同的字符串(作为原始的C风格字符串,也是以NUL结尾的)。

有关更多详细信息,请参见this answer


那么,在C++11中,空终止字符是存储在索引0而不是最后一个索引吗?你能详细解释一下吗?我们正在探讨非常有趣的事情。 :) - B-Mac
@Grendan:似乎在尝试包含推理。 - Deduplicator
@Grendan:&s[0] 是指向被 std::string 类包装的字符串开头的指针。如果这个指针指向与 c_str() 返回的字符串相同的字符串,因为 c_str() 根据定义返回一个以 NUL 结尾的字符串(即以 NUL 结尾的 C 风格字符串),那么这意味着 &s[0] 返回的字符串也以 NUL 结尾。NUL 终止符在字符串末尾。注意,由于 std::string 保持字符计数,您还可以在字符串中嵌入多个 NUL 字符。 - Mr.C64

0
你需要问的问题是为什么 C 字符串应该以 null 结尾。
答案是字符串操作函数需要知道字符串的确切长度。因为 C 中的字符串只是字符数组,没有任何信息告诉它们(这是数组的大小),所以它们需要一些东西来帮助确定数组的大小,即位于其末尾的空字符。
而在 Java 中,字符串是 String 类的实例,它具有 length 字段,因此不需要 null 终止。
C++ 中的字符串也是同样的情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接