是的,我确实检查了其他主题并得出结论。 我只是想让你确认一下,以免我有任何误解。
Java String对象不是以null结尾。
C ++ std :: string对象也不是空终止
C字符串或C风格的字符串(如果你愿意的话)(字符数组)是唯一以空字符结尾的字符串。
正确还是错误?
答案 0 :(得分:5)
C字符串是以0结尾的字符串。你不是被迫在C中使用它们。
C ++ std::string
和Java字符串都是计数字符串,这意味着它们存储它们的长度。
But C++ std::string
s 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 ++中的字符串。