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

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

结果:"错误:不能转换' std::string '到' char '…"

有什么方法可以做到这一点?


当前回答

下面是Protocol Buffer的一个更健壮的版本

char* string_as_array(string* str)
{
    return str->empty() ? NULL : &*str->begin();
}

// test codes
std::string mystr("you are here");
char* pstr = string_as_array(&mystr);
cout << pstr << endl; // you are here

其他回答

它不会自动转换(感谢上帝)。您必须使用c_str()方法来获取C字符串版本。

std::string str = "string";
const char *cstr = str.c_str();

注意,它返回一个const char *;你不允许改变c_str()返回的c风格字符串。如果你想处理它,你必须先复制它:

std::string str = "string";
char *cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());
// do stuff
delete [] cstr;

或者在现代c++中:

std::vector<char> cstr(str.c_str(), str.c_str() + str.size() + 1);

为了完整起见,不要忘记std::string::copy()。

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);

假设你只需要一个c风格的字符串作为输入传递:

std::string str = "string";
const char* chr = str.c_str();

下面是Protocol Buffer的一个更健壮的版本

char* string_as_array(string* str)
{
    return str->empty() ? NULL : &*str->begin();
}

// test codes
std::string mystr("you are here");
char* pstr = string_as_array(&mystr);
cout << pstr << endl; // you are here
char* result = strcpy((char*)malloc(str.length()+1), str.c_str());