是的,我查看了其他帖子并得出了结论。 我只是想让你确认一下,以便我没有任何误解。
Java字符串对象没有空终止符。
C ++ std :: string对象也没有空终止符。
C字符串或C风格字符串(字符数组)是唯一以空终止符结尾的字符串。
正确还是不正确?
C-strings是以0结尾的字符串。但在C中并不强制要求使用它们。
C++的std::string
和Java字符串都是计数字符串,也就是说它们存储其长度。
但自C++11以来,C++的std::string
也跟随着一个0,如果(通常情况下)它们不包含任何嵌入式0,则使它们成为0结尾的字符串API更好地互操作性。
这些说法本身都是正确的,但有点小题大作:C风格字符串不仅仅在C语言中存在,在其他地方也会出现(最常见的是各种形式的汇编代码,而且C语言最初被设计为“略高于汇编语言”,因此这并不让人感到意外)。
而且在C++11中,std::string
保证在实际字符串字符后面有一个NUL终止符[但如果您愿意,可以将NULL字符存储在字符串中](至少如果调用c_str()
,但在我看过的实现中,它在创建/更新时存储在那里)
std::string
和java的String
都有私有字段来表示字符串的长度。不需要使用NULL终止符。
std::string
方法c_str
返回一个以NULL结尾的char数组,用于需要NULL终止符的情况,例如c字符串函数,如strlen
。几乎正确。
C字符串不仅仅是字符数组。它们是一个以空字符结尾的字符数组。
因此,如果您有一个字符数组,它还不是C字符串,它只是普通的字符数组。它必须有一个终止的空字符才能成为有效的C风格字符串。
此外,自C++11起,std::string
也必须以空字符结尾。(但它仍然有一个私有变量来保存字符串的长度。)
我不了解Java部分,但在C++11中,std::string
是以NUL结尾的(除了存储字符计数之外),即&s[0]
返回与s.c_str()
相同的字符串(作为原始的C风格字符串,也是以NUL结尾的)。
有关更多详细信息,请参见this answer。
String
类的实例,它具有 length
字段,因此不需要 null 终止。