所以我知道所有C字符串都是C ++中的字符数组。字符串呢?
为什么char x[] = {'H', 'i'};
不是C字符串?
x
是一个字符数组,表示它是C字符串。我想念什么吗?
答案 0 :(得分:2)
在这里,我刚刚为您的问题找到了很好的解释:C strings and C++ strings。简而言之:
通常将C字符串声明为char数组。但是,char数组本身不是C字符串。有效的C字符串要求存在一个终止的“空字符”(ASCII值为0的字符,通常由字符文字'\ 0'表示)。
C ++字符串是类字符串的对象,该类字符串在头文件中定义且在标准名称空间中。字符串类具有几个构造函数,可以调用它们(显式或隐式)以创建字符串对象。
内存中的表示形式
已更新:
您应该了解:
与C中的char
相比,C ++提供的字符类型更多,例如UTF-16和UTF-32。
C ++定义了一个名为std::basic_string
的东西,它是用于从这些字符类型中提取字符串的类模板。
C ++ typedef
的{{1}}类型的类模板为char
。
现在,您知道std::string
是std::string
型字符的basic_string
。参考Does std::string need to store its character in a contiguous piece of memory?,如果您提到char
,那么对于std::string
及更高版本,它实际上是C++ 11
型字符的AN数组(不是两个或更多数组)。对于char
之前的C++
版本或某些其他类型的字符(实际上我不确定),底层内存可能不是连续的(即,它可能需要两个或更多数组(而不是AN数组))用于存储字符串)。
答案 1 :(得分:0)
C字符串是 空终止的字符串 ,因此,任何不以零结尾的字符数组都不是C字符串。
C字符串是字符数组char *
或char []
但是关于C ++字符串,它是一个类,上面有很多操作(方法),它具有长度,并检查长度(例如C ++ vector
和array
),当您尝试访问它的数组下标时(使用at
方法)。它的复制性能可能更高,因为已知分配新内存位置的长度。
您可以从C字符串创建std::string
。有一个构造函数需要一个C字符串和一个长度,并从中创建一个std :: string。
所有处理字符串的C函数,都将C字符串视为以null结尾的字符串,因此,如果不是,则C将继续搜索最接近的下一个null,这非常危险。
答案 2 :(得分:0)
C ++提供了定义class string
的标准库形式。类字符串不仅仅是一个C字符串(char* C
或char sz [])。类字符串具有方法和属性,而后者则没有。同样,类字符串的大小会更改运行时,而后者不会更改。它还可以在其Ctor和dtor中为您管理内存。作为建议,请尽可能使用Class字符串,而不要使用char *。
\0
,以表示字符串末尾的符号,而后者则不行。答案 3 :(得分:0)
如前面的答案中所述,char x [] = {'H','i'};不是有效的C字符串,因为没有空字符来标识字符串的终止或结尾。 C ++标准模板提供了String类,该类保证了动态连续内存分配(类似于Vector)并易于按索引访问。有关更多信息,请参见https://en.cppreference.com/w/cpp/string/basic_string。