std :: string到char *
我想将std :: string转换为char *或char []数据types。
std::string str = "string"; char* chr = str;
结果是: “错误:不能将'std :: string'转换为'char'…” 。
有什么方法可以做到这一点?
它不会自动转换(感谢上帝)。 你将不得不使用方法c_str()
来获取Cstring版本。
std::string str = "string"; const char *cstr = str.c_str();
请注意,它返回一个const char *
; 您不允许更改c_str()
返回的C风格的string。 如果你想处理它,你必须先复制它:
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);
更多细节在这里 , 这里,但你可以使用
string str = "some string" ; char *cstr = &str[0u];
如果我需要一个c ++的string内容的可变原始副本,那么我会这样做:
std::string str = "string"; char* chr = strdup(str.c_str());
然后:
free(chr);
那么为什么我不像其他人一样摆弄std :: vector或new []? 因为当我需要一个可变的C风格的原始char *string,那么因为我想调用改变string的C代码,并且C代码用free()释放了一些东西,并用malloc()分配(strdup使用malloc) 。 所以,如果我将我的原始string传递给用C语言编写的某个函数X ,那么它可能会对它必须在堆上分配的参数(例如,函数可能需要调用realloc参数)有一个约束。 但是,这是不太可能的,它会期望分配(一些用户重新定义)新的[]!
(这个答案只适用于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*
-
如果你只是想要一个C风格的string代表相同的内容:
char const* ca = str.c_str();
-
如果你想要一个带有新内容的C风格的string,一种方式(在编译时你不知道string大小)是dynamic分配:
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
不会隐式地转换为这些types,因为需要这样做的简单原因通常是devise异味。 确保你真的需要它。
如果你确实需要char*
, 最好的方法可能是:
vector<char> v(str.begin(), str.end()); char* ca = &v[0]; // pointer to start of vector
假设你只需要一个C风格的string作为input:
std::string str = "string"; const char* chr = str.c_str();
作为对bobobobo的回答的评论会更好,但是我没有那个代表。 它完成同样的事情,但有更好的做法。
虽然其他答案是有用的,如果你需要将std::string
转换为char*
而不是const,那么const_cast
是你的朋友。
std::string str = "string"; char* chr = const_cast<char*>(str.c_str());
请注意,这不会给你一个数据的副本; 它会给你一个指向string的指针。 因此,如果你修改了一个chr
的元素,你将会修改str
。
要严格迂腐,你不能“将std :: string转换为char *或char []数据types”。
正如其他答案所示,您可以将std :: string的内容复制到一个char数组,或者将一个const char *复制到std :: string的内容中,以便您可以用“C风格” 。
如果你想改变std :: string的内容,std :: stringtypes就有了所有的方法来做任何你可能需要做的事情。
如果你想把它传递给一个接受char *的函数,就有std :: string :: c_str()。
为了完整起见,不要忘记std::string::copy()
。
std::string str = "string"; const size_t MAX = 80; char chrs[MAX]; str.copy(chrs, MAX);
std::string::copy()
不会NUL终止。 如果您需要确保在Cstring函数中使用NUL终结符:
std::string str = "string"; const size_t MAX = 80; char chrs[MAX]; memset(chrs, '\0', MAX); str.copy(chrs, MAX-1);
或者,你可以使用向量来获得一个可写的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 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());
你可以使用迭代器。
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());