字符串中的空终止

时间:2015-02-24 22:22:00

标签: java c++ c string

是的,我确实检查了其他主题并得出结论。 我只是想让你确认一下,以免我有任何误解。

  

Java String对象不是以null结尾。

     

C ++ std :: string对象也不是空终止

     

C字符串或C风格的字符串(如果你愿意的话)(字符数组)是唯一以空字符结尾的字符串。

正确还是错误?

7 个答案:

答案 0 :(得分:5)

C字符串是以0结尾的字符串。你不是被迫在C中使用它们。

C ++ std::string和Java字符串都是计数字符串,这意味着它们存储它们的长度。

But C++ std::strings are also followed by a 0 since C++11,如果(通常情况下)它们不包含任何嵌入的0,则使它们0终止,以便更好地与0终止字符串API进行互操作。

答案 1 :(得分:2)

所有这些本身都是正确的,但是小小的内容:C风格的字符串并不是C独有的,还有其他地方会出现这种情况(最常见的是各种形式的汇编程序代码,而C语言是最初设计的语言)要比#34;略高于汇编程序"使这个"毫不奇怪")。

在C ++ 11中,std::string保证在最后一个实际字符串字符之后有一个NUL终止符[但如果你愿意,它可以在字符串中存储NULL字符有效](至少如果您拨打c_str(),但在我已查看的实施中,它会在创建/更新时存储在其中

答案 2 :(得分:1)

所有陈述都没有错,但需要澄清每种语言的更多细节。

答案 3 :(得分:1)

这是正确的c ++ std::string和java String都包含指示字符串长度的私有字段。不需要NULL终止符。

std::string方法c_str将字符串作为NULL终止的char数组返回,以便在需要NULL终止符时使用。 c字符串函数,例如strlen

答案 4 :(得分:0)

差不多正确。

  • C-string不仅仅是一个字符数组。它们是以null结尾的字符数组。

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

  • 此外,std::string must also be null-terminated (since C++11)。 (但它仍然有一个保存字符串长度的私有变量。)

答案 5 :(得分:0)

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

有关详细信息,请参阅this answer

答案 6 :(得分:0)

您需要问的问题是为什么C-String应该为空终止。

答案是字符串操作函数需要知道字符串的确切长度。由于C中的字符串只是字符数组,因此没有信息告诉(这是这个数组的大小),它们需要一些东西来帮助确定数组的大小,该数组是位于其末尾的空字符。

在Java字符串中,String类的实例具有length字段,因此不需要空终止。

同样的事情适用于c ++中的字符串。