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