当前位置:  开发笔记 > 编程语言 > 正文

C++中字符串和char []类型之间的区别

如何解决《C++中字符串和char[]类型之间的区别》经验,为你挑选了4个好方法。

我知道一点C,现在我正在看看C++.我习惯使用char数组来处理C字符串,但是当我看到C++代码时,我看到有使用字符串类型和字符串数组的示例:

#include 
#include 
using namespace std;

int main () {
  string mystr;
  cout << "What's your name? ";
  getline (cin, mystr);
  cout << "Hello " << mystr << ".\n";
  cout << "What is your favorite team? ";
  getline (cin, mystr);
  cout << "I like " << mystr << " too!\n";
  return 0;
}

#include 
using namespace std;

int main () {
  char name[256], title[256];

  cout << "Enter your name: ";
  cin.getline (name,256);

  cout << "Enter your favourite movie: ";
  cin.getline (title,256);

  cout << name << "'s favourite movie is " << title;

  return 0;
}

(两个例子来自http://www.cplusplus.com)

我想这是一个广泛问及回答(显而易见的?)的问题,但如果有人能告诉我在C++中处理字符串的两种方式之间的区别是什么(性能,API集成,每种方式都是更好,...).

谢谢.



1> Cygon..:

char数组就是这样 - 一个字符数组:

如果在堆栈上分配(如在您的示例中),它将始终占用例如.256字节,无论它包含的文本有多长

如果在堆上分配(使用malloc()或new char []),那么您负责释放内存,并且总是会有堆分配的开销.

如果将超过256个字符的文本复制到数组中,它可能会崩溃,产生丑陋的断言消息或导致程序中其他地方无法解释(错误)的行为.

要确定文本的长度,必须逐个字符地扫描数组,以获得\ 0字符.

字符串是包含char数组的类,但会自动为您管理它.大多数字符串实现都有一个16个字符的内置数组(因此短字符串不会使堆分段)并使用堆来获取更长的字符串.

您可以像这样访问字符串的char数组:

std::string myString = "Hello World";
const char *myStringChars = myString.c_str();

C++字符串可以包含嵌入的\ 0字符,知道它们的长度而不计算,比短文本的堆分配字符数组快,并保护您免受缓冲区溢出.此外,它们更易读,更易于使用.

-

但是,C++字符串不适合跨越DLL边界使用,因为这需要任何具有这种DLL函数的用户来确保他使用完全相同的编译器和C++运行时实现,以免他的字符串类表现不同.

通常,字符串类也会在调用堆上释放其堆内存,因此如果您使用运行时的共享(.dll或.so)版本,它只能再次释放内存.

简而言之:在所有内部函数和方法中使用C++字符串.如果您曾编写.dll或.so,请在公共(dll/so-exposed)函数中使用C字符串.


另外,字符串有一堆辅助函数,可以非常整洁.

2> Mark Rushako..:

Arkaitz是正确的,string是一种托管类型.这对意味着你永远不必担心字符串有多长,你也不必担心释放或重新分配字符串的内存.

另一方面,上述char[]情况中的符号将字符缓冲区限制为正好256个字符.如果您尝试将超过256个字符写入该缓冲区,则最多会覆盖程序"拥有"的其他内存.在最坏的情况下,您将尝试覆盖您不拥有的内存,并且您的操作系统将在现场终止您的程序.

底线?字符串对程序员更友好,char []对计算机来说效率更高.


在最坏的情况下,其他人将覆盖内存并在您的计算机上运行恶意代码.另见[缓冲区溢出](http://cwe.mitre.org/data/definitions/120.html).

3> Arkaitz Jime..:

好吧,字符串类型是字符串的完全托管类,而char []仍然是C语言中的字符串,表示字符串的字节数组.

在API和标准库方面,一切都是根据字符串而不是char []来实现的,但是仍然有很多来自libc的函数接收char []所以你可能需要将它用于那些,除此之外我会总是使用std :: string.

就效率而言,非托管内存的原始缓冲区对于很多东西几乎总是会更快,但考虑到比较字符串,例如,std :: string总是要先检查它的大小,而使用char []你需要逐个字符地比较.



4> Abhay..:

除了与旧代码的兼容性之外,我个人认为没有理由为什么要使用char*或char [].std :: string不会比使用c-string慢,除非它会为你处理重新分配.您可以在创建时设置它的大小,从而避免在需要时重新分配.它的索引操作符([])提供了恒定的时间访问(并且在每个意义上都与使用c-string索引器完全相同).除非你编写它,否则使用at方法可以为你设置检查安全性,这是c-strings无法获得的.您的编译器通常会在发布模式下优化索引器的使用.用c弦很容易弄乱; 诸如delete vs delete []之类的东西,异常安全,甚至如何重新分配c-string.

当你必须处理像COW字符串这样的高级概念,以及MT等非COW时,你需要std :: string.

如果您担心副本,只要您使用引用和const引用,您将不会因副本而产生任何开销,这与您对c-string的操作相同.

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有