C字符串和C++字符串有什么区别?

27

C字符串和C++字符串有什么区别,特别是在进行动态内存分配时?


дҪ жҳҜжҢҮдёӨз§ҚиҜӯиЁҖдёӯдҪҝз”Ёchar*е’Ңchar[]еӯ—з¬ҰдёІзҡ„еҢәеҲ«пјҢиҝҳжҳҜcharеҹәзЎҖеӯ—з¬ҰдёІе’Ңstd::stringд№Ӣй—ҙзҡ„еҢәеҲ«пјҹ - dmckee --- ex-moderator kitten
3
请定义您所说的"C字符串"和"C++字符串"。这两个术语(尤其是后者)都具有歧义。 "C字符串"指的是一个以空字符('\0')结尾的字符数组,在C语言中通常用于表示文本。而"C++字符串"通常指的是标准库中的std::string类型,它是一个动态分配的、可变长的字符串类。 - strager
1
我想不出他们可能有什么共同点,我得再想想。 - Hans Passant
4
@ Gollum,那可能是实现问题。我不认为标准里有任何内容说C++字符串不允许以空字符结尾。事实上,这可能会使c_str更容易实现。 - paxdiablo
1
我认为通常它们是以空字符结尾的,这样在调用c_str()时可以节省创建临时缓冲区的开销。 - Matt Joiner
显示剩余3条评论
3个回答

45

我不知道从哪里开始 :-)

在C语言中,字符串只是以空字符结尾的char数组。在动态内存管理方面,您可以简单地为它们分配空间(包括额外的字节)使用malloc函数。修改字符串时的内存管理是的责任:

char *s = strdup ("Hello");
char *s2 = malloc (strlen (s) + 6);
strcpy (s2, s);
strcat (s2, ", Pax");
free (s);
s = s2;

C++ 中的字符串 (std::string) 是带有所有相关自动内存管理和控制的对象,这使得它们对于初学者来说更加安全、易于使用。对于动态分配,可以使用以下方法:

std::string s = "Hello";
s += ", Pax";

我知道我更喜欢使用后者。如果需要,你总是可以通过使用c_str()方法将一个std::string构造成C字符串。


17

C++字符串更加安全、易于使用,并支持不同的字符串操作函数,例如附加、查找、复制、连接等。

在C字符串和C++字符串之间的一个有趣的区别可以通过以下示例说明。

#include <iostream>                            
using namespace std;

int main() {
    char a[6]; //c string
    a[5]='y';
    a[3]='o';
    a[2]='b';
    cout<<a; 
    return 0;
}

输出 »¿boRy¤£f·Pi»¿

#include <iostream> 
using namespace std; 
int main() 
{ 
  string a; //c++ string
  a.resize(6);
  a[5]='y';
  a[3]='o';
  a[2]='b';
  cout<<a;
  return 0;
}

输出 男孩

我希望你明白了要点!!


3
C语言中这种行为是导致像心脏出血漏洞这样的bug发生的原因。 - saolof

1
区别在于某些操作的速度以及封装常见错误发生的位置。 std::string 维护有关字符串内容和长度的信息。这意味着它不像 const char * 那样容易发生缓冲区溢出。对于大多数操作,它也比 const char * 更快,因为字符串的长度是已知的。 大多数 cstring 操作在操作之前会在底层调用 strlen() 来查找字符串的长度,这会影响性能。 std::string 与 STL 算法和其他容器兼容。 最后,std::string 不会像 char * 一样出现相同的“陷阱!”时刻。

1
C字符串不是char *const char *,它们只是以空字符结尾的字符数组。即使字符串字面值也只是字符数组。 - ad absurdum

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