将std::string转换为char*

470

我想将一个 std::string 转换为 char*char[] 数据类型。

std::string str = "string";
char* chr = str;

结果是:“错误:无法将'std::string'转换为'char' ...”

有哪些可用的方法可以解决这个问题?


这个回答解决了你的问题吗?如何将std :: string转换为const char *或char * - ead
18个回答

5

面向对象编程风格中的转换

converter.hpp

class StringConverter {
    public: static char * strToChar(std::string str);
};

converter.cpp

char * StringConverter::strToChar(std::string str)
{
    return (char*)str.c_str();
}

用法

StringConverter::strToChar("converted string")

我喜欢将cast转换为char,这样可以从c_str的输出中消除const。我认为c_str返回const char的原因是为了消除潜在的内存访问问题,通过提供一个只读版本的东西。 OP想要一个char,但我认为他最好使用c_str的const char输出,因为那样更安全,并且使用char的函数通常也使用const char(假设函数不会像改变它们的输入一样做任何事情,这通常不应该)。 - Felipe Valdes

4
您可以使用迭代器来实现。
std::string str = "string";
std::string::iterator p=str.begin();
char* chr = &(*p);

祝您好运。


4

使用unique_ptr实现orlp的char* answer的安全版本:

std::string str = "string";
auto cstr = std::make_unique<char[]>(str.length() + 1);
strcpy(cstr.get(), str.c_str());

4

为了完整性,请不要忘记 std::string::copy()

(意思是在讲述it技术时,需要提到这个函数)
std::string str = "string";
const size_t MAX = 80;
char chrs[MAX];

str.copy(chrs, MAX);

std::string::copy()不会添加NUL终止符。如果需要在C字符串函数中确保有NUL终止符:

std::string str = "string";
const size_t MAX = 80;
char chrs[MAX];

memset(chrs, '\0', MAX);
str.copy(chrs, MAX-1);

3

另外,您可以使用向量来获取一个可写的char*,如下所示:

//this handles memory manipulations and is more convenient
string str;
vector <char> writable (str.begin (), str.end) ;
writable .push_back ('\0'); 
char* cstring = &writable[0] //or &*writable.begin () 

//Goodluck  

这将为向量分配新的内存,然后复制每个字符。std::string已经是一个容器,你可以将0 push_back到你的字符串中,然后使用&str[0]。 - GaspardP

3
char* result = strcpy((char*)malloc(str.length()+1), str.c_str());

2
这也可以运行。
std::string s;
std::cout<<"Enter the String";
std::getline(std::cin, s);
char *a=new char[s.size()+1];
a[s.size()]=0;
memcpy(a,s.c_str(),s.size());
std::cout<<a;  

0

没人提到过sprintf吗?

std::string s;
char * c;
sprintf(c, "%s", s.c_str());

1
现在这样做会导致分段错误。在调用sprintf之前,您需要为char数组分配内存,可以在堆栈或堆上进行分配。最简单的方法是使用字符串的长度来确定char数组的大小。 - hairlessbear

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