我想将std::string转换为char*或char[]数据类型。
std::string str = "string";
char* chr = str;
结果:"错误:不能转换' std::string '到' char '…"
有什么方法可以做到这一点?
我想将std::string转换为char*或char[]数据类型。
std::string str = "string";
char* chr = str;
结果:"错误:不能转换' std::string '到' char '…"
有什么方法可以做到这一点?
它不会自动转换(感谢上帝)。您必须使用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();
If you just want a C-style string representing the same content: 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'; Don't forget to delete[] it later. If you want a statically-allocated, limited-length array instead: 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);
string不会隐式转换为这些类型,原因很简单,需要这样做通常是一种设计风格。确保你真的需要它。
如果你确实需要一个char*,最好的方法可能是:
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);
So why don't I fiddle with std::vector or new[] like anyone else? Because when I need a mutable C-style raw char* string, then because I want to call C code which changes the string and C code deallocates stuff with free() and allocates with malloc() (strdup uses malloc). So if I pass my raw string to some function X written in C it might have a constraint on it's argument that it has to allocated on the heap (for example if the function might want to call realloc on the parameter). But it is highly unlikely that it would expect an argument allocated with (some user-redefined) 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*,如下所示;
//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的回答的一个更好的评论,但我没有那个代表。它完成了同样的事情,但是使用了更好的实践。
虽然其他答案很有用,但如果你需要显式地将std::string转换为char*而不使用const, 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")
使用c_str()成员函数从std::string对象中获取const char *类型:
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()之前不能保证以null结尾。