2011-12-09 28 views

回答

3

您可以在运行时创建称为与“新”算子大小的数组:

char* res = new char[str.size()+1]; 
strncpy(res, str.c_str(), str.size()+1); 
+1

如果'string'包含任何嵌入的空字符,则'strncpy'将截断数据。 'memcpy'在这里更合适,或者是一个合适的容器,比如'std :: vector <>'。 – ildjarn

-1

使用strlen()来查找字符串的长度,然后malloc()是该大小的char数组。

5

上自由存储区分配内存,并在一次复印的字符串:

std::string s("abcdef"); 

... 
char* chars=strdup(s.c_str()); 

当然,您需要手动释放内存。文档例如在man page。由于@Loki提到:释放此内存是通过free(chars)完成的,而不是通过delete。另外,您需要包含<cstring>标题。

如果你想留在C++世界,使用vector;它可以用两个迭代器创建来复制它的数据,并且将在堆上分配,将自行清理。这不是一种享受吗?

std::vector<char> vec(s.begin(), s.end()); 
+0

现在你必须用free()来代码。因此,它为您节省了一行代码,但由于您需要管理两个不同的内存池,所以代码变得更加复杂。 –

+0

@LokiAstari:那是非常真实的。我应该补充说 - 尽管如此,我个人更喜欢矢量方法。 – xtofl

+1

+1,用于推荐'std :: vector <>'。 – ildjarn

2
std::string s = "hello"; 
char* c = new char[s.length() + 1]; // '+ 1' is for trailing NULL character. 

strcpy(c, s.c_str()); 
1
#include <string> 

int main(int argc, char *argv[]) 
{ 
    std::string random_data("This is a string"); 

    char *array=new char[random_data.size()+1]; 

    // do stuff 

    delete[] array; 

    return 0; 
} 
1

尝试:

​​

或者:(最好)

std::vector<char> res(str.begin(), str.end()); 

或者:如果你想要做的是调用C-结:

str.c_str()