Std::string到char*

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

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

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

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

1128009 次浏览

它不会自动转换(感谢上帝)。你必须使用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);

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

std::string str = "string";
const char* chr = str.c_str();
  • 如果你只是想要一个c风格的字符串表示相同的内容:

    char const* ca = str.c_str();
    
  • If you want a C-style string with new contents, one way (given that you don't know the string size at compile-time) is dynamic allocation:

    char* ca = new char[str.size()+1];
    std::copy(str.begin(), str.end(), ca);
    ca[str.size()] = '\0';
    

    别忘了以后delete[]

  • 如果你想要一个静态分配的有限长度数组:

    size_t const MAX = 80; // maximum number of chars
    char ca[MAX] = {};
    std::copy(str.begin(), (str.size() >= MAX ? str.begin() + MAX : str.end()), ca);
    

std::string doesn't implicitly convert to these types for the simple reason that needing to do this is usually a design smell. Make sure that you really need it.

If you definitely need a char*, the best way is probably:

vector<char> v(str.begin(), str.end());
char* ca = &v[0]; // pointer to start of vector

(这个答案只适用于c++ 98。)

请不要使用原始的char*

std::string str = "string";
std::vector<char> chars(str.c_str(), str.c_str() + str.size() + 1u);
// use &chars[0] as a char*

严格说来,您不能“将std::string转换为char*或char[]数据类型”。

正如其他答案所示,你可以将std::string的内容复制到一个char数组中,或者对std::string的内容创建一个const char*,这样你就可以以“C风格”访问它。

如果你试图改变std::string的内容,std::string类型有所有的方法来做任何你可能需要做的事情。

如果你试图将它传递给某个接受char*的函数,则有std::string::c_str()。

如果我需要c++字符串内容的可变原始副本,那么我会这样做:

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

后来:

free(chr);

那么为什么我不像其他人一样摆弄std::vector或new[]呢?因为当我需要一个可变的C风格的原始char*字符串时,然后因为我想调用C代码来更改字符串和C代码释放free()的东西,并分配malloc() (strdup使用malloc)。因此,如果我将原始字符串传递给某个函数X 用C写的,它可能对它的参数有一个约束,它必须在堆上分配(例如,如果该函数可能想对参数调用realloc)。但它不太可能期望使用(一些用户重新定义的)new[]分配参数!

详情请点击这里在这里,但是你可以使用

string str = "some string" ;
char *cstr = &str[0];

从c++ 11开始,你也可以使用str.data()成员函数,它返回char *

string str = "some string" ;
char *cstr = str.data();

为了完整起见,不要忘记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);

这个也可以

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;
char* result = strcpy((char*)malloc(str.length()+1), str.c_str());

或者,你可以使用向量来获得一个可写的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

下面是来自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

你可以使用迭代器。

std::string str = "string";
std::string::iterator p=str.begin();
char* chr = &(*p);

祝你好运。

orlp的char*答案的安全版本使用unique_ptr:

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

这可能是对bobobobo的回答的一个更好的评论,但我没有那个代表。它完成了同样的事情,但是使用了更好的实践。

虽然其他答案很有用,但如果你需要在没有const的情况下显式地将std::string转换为char*const_cast是你的朋友。

std::string str = "string";
char* chr = const_cast<char*>(str.c_str());

注意,这将给你一个数据的副本;它会给你一个指向字符串的指针。因此,如果你修改了chr中的一个元素,你将修改str

OOP风格的转换

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

要从std::string中获取const char *,请使用c_str()成员函数:

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

要从std::string对象中获得非const的char *,可以使用data()成员函数,该函数自c++ 17起返回非const指针:

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

对于该语言的旧版本,您可以使用范围构造将字符串复制到一个vector中,从中可以获得非const指针:

std::string str = "string";
std::vector<char> str_copy(str.c_str(), str.c_str() + str.size() + 1);
char* chr = str_copy.data();

但要注意,这不会让你修改str中包含的字符串,只有副本的数据可以这样改变。注意,在旧版本的语言中使用c_str()是特别重要的,因为在那时候,std::string在调用c_str()之前不能保证为空终止。

没有人提到过sprintf?

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