我懂一点C,现在我来看看C++。我习惯于使用char数组来处理C字符串,但是当我查看C++代码时,我发现有同时使用string类型和char数组的示例:
#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;
}
和
#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++中处理字符串的方式(性能,应用编程接口集成,每种方式都更好,等等)之间到底有什么区别,那就太好了。
谢谢。
发布于 2009-08-17 11:06:05
char数组就是一个字符数组:
()或
string是一个包含char数组的类,但会自动为您管理它。大多数字符串实现都有一个内置的16个字符的数组(因此短字符串不会将堆分成碎片),并将堆用于较长的字符串。
您可以像这样访问字符串的char数组:
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字符串。
发布于 2009-08-17 11:00:27
Arkaitz关于string
是托管类型的说法是正确的。这对您来说意味着,您不必担心字符串的长度,也不必担心释放或重新分配字符串的内存。
另一方面,上例中的char[]
表示法将字符缓冲区限制在256个字符以内。如果您尝试向该缓冲区写入超过256个字符,充其量您将覆盖您的程序“拥有”的其他内存。在最坏的情况下,您将尝试覆盖您不拥有的内存,并且您的操作系统将当场杀死您的程序。
底线是什么?字符串对程序员更友好,char[]对计算机的效率也更高。
发布于 2009-08-17 10:54:28
嗯,string type是一个完全托管的字符串类,而char[]仍然是它在C中的样子,一个字节数组为您表示一个字符串。
就API和标准库而言,所有的东西都是以字符串的形式实现的,而不是char[],但是libc仍然有很多接收char[]的函数,所以你可能需要使用它,除此之外,我总是使用std::string。
当然,就效率而言,非托管内存的原始缓冲区对于许多事情几乎总是更快,但考虑到比较字符串,例如,std::string的大小总是可以首先进行检查,而使用char[]时,您需要逐个字符地进行比较。
https://stackoverflow.com/questions/1287306
复制相似问题