首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++中string和char[]类型的区别

C++中string和char[]类型的区别
EN

Stack Overflow用户
提问于 2009-08-17 10:52:35
回答 7查看 255.5K关注 0票数 145

我懂一点C,现在我来看看C++。我习惯于使用char数组来处理C字符串,但是当我查看C++代码时,我发现有同时使用string类型和char数组的示例:

代码语言:javascript
运行
复制
#include <iostream>
#include <string>
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;
}

代码语言:javascript
运行
复制
#include <iostream>
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++中处理字符串的方式(性能,应用编程接口集成,每种方式都更好,等等)之间到底有什么区别,那就太好了。

谢谢。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-08-17 11:06:05

char数组就是一个字符数组:

  • 如果在堆栈上分配(就像你的例子中一样),它将总是占用eg。256个字节,无论它包含的文本有多长,如果在堆上分配(使用

()或

  • char[]),您将负责随后释放内存,并且您将始终有堆分配的开销。
  • 如果将超过256个字符的文本复制到数组中,则可能会崩溃、产生丑陋的断言消息或在程序的其他位置造成无法解释的(错误)行为。
  • 要确定文本的长度,必须逐个字符地扫描数组以查找\0字符。

string是一个包含char数组的类,但会自动为您管理它。大多数字符串实现都有一个内置的16个字符的数组(因此短字符串不会将堆分成碎片),并将堆用于较长的字符串。

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

代码语言:javascript
运行
复制
std::string myString = "Hello World";
const char *myStringChars = myString.c_str();

C++字符串可以包含嵌入的\0个字符,知道它们的长度而无需计数,比堆分配的短文本字符数组更快,并防止缓冲区溢出。此外,它们更具可读性,更易于使用。

但是,C++字符串并不(非常)适合跨DLL边界使用,因为这将要求使用此类DLL函数的任何用户确保使用完全相同的编译器和C++运行时实现,以免他冒着字符串类行为不同的风险。

通常,string类还会在调用堆上释放其堆内存,因此只有在使用共享(.dll或.so)版本的运行时时,它才能再次释放内存。

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

票数 206
EN

Stack Overflow用户

发布于 2009-08-17 11:00:27

Arkaitz关于string是托管类型的说法是正确的。这对您来说意味着,您不必担心字符串的长度,也不必担心释放或重新分配字符串的内存。

另一方面,上例中的char[]表示法将字符缓冲区限制在256个字符以内。如果您尝试向该缓冲区写入超过256个字符,充其量您将覆盖您的程序“拥有”的其他内存。在最坏的情况下,您将尝试覆盖您不拥有的内存,并且您的操作系统将当场杀死您的程序。

底线是什么?字符串对程序员更友好,char[]对计算机的效率也更高。

票数 16
EN

Stack Overflow用户

发布于 2009-08-17 10:54:28

嗯,string type是一个完全托管的字符串类,而char[]仍然是它在C中的样子,一个字节数组为您表示一个字符串。

就API和标准库而言,所有的东西都是以字符串的形式实现的,而不是char[],但是libc仍然有很多接收char[]的函数,所以你可能需要使用它,除此之外,我总是使用std::string。

当然,就效率而言,非托管内存的原始缓冲区对于许多事情几乎总是更快,但考虑到比较字符串,例如,std::string的大小总是可以首先进行检查,而使用char[]时,您需要逐个字符地进行比较。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1287306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档