std::string到char*

我想把std::string转换为charchar[]数据类型。

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

结果是。"error: cannot convert 'std::string' to '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 cstr(str.c_str(), str.c_str() + str.size() + 1);
评论(18)

更多细节在这里,和这里,但您可以使用

string str = "some string" ;
char *cstr = &str[0];
评论(12)

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

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

而后。

free(chr); 

那么为什么我不像其他人一样使用std::vector或者new[]呢? 因为当我需要一个可变的C-style raw char/字符串时,那么因为我要调用C代码来改变字符串,而C代码会用free()来dealloc(),用malloc()来分配东西(strdup使用malloc)。 所以,如果我把我的原始字符串传给某个函数X 用C编写,它可能会对它的参数有一个约束,即它必须在堆上分配(例如,如果函数可能要调用参数的realloc)。 但它极不可能期望一个用(一些用户定义的)new[]分配的参数!

评论(1)

(本答案只适用于C++98。)

请不要使用生char*

std::string str = "string";
std::vector chars(str.c_str(), str.c_str() + str.size() + 1u);
// use &chars[0] as a char*
评论(10)
  • 如果你只是想要一个代表相同内容的C风格的字符串。

      char const* ca = str.c_str();
  • 如果你想要一个具有_新内容的C风格的字符串,一种方法(鉴于你在编译时不知道字符串的大小)是动态分配。

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

    不要忘了以后要删除[]

  • 如果你想要一个静态分配的、有限长度的数组来代替。

      size_t const MAX = 80; // 最大字符数
      char ca[MAX] = {};
      std::copy(str.begin(), (str.size() >= MAX ? str.begin() + MAX : str.end()), ca)。)

std::string不隐含地转换为这些类型,原因很简单,需要这样做通常是一种设计的味道。请确保你真的需要它。

如果你确定需要一个char*,_最好的方法可能是。

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

这最好是作为对bobobobo'的回答的评论,但我没有'的代表。 它实现了同样的事情,但有更好的做法。

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

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

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

评论(0)

假设你只需要一个C语言风格的字符串作为输入来传递。

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

严格来说,你不能"将一个std::string转换为char*或char[]数据类型.&quot。

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

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

如果你想把它传递给一些接受char*的函数,有'std::string::c_str()。

评论(0)

为了完整性&#39。 的缘故,不要忘记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);
评论(0)

下面是 "协议缓冲区 "的一个更强大的版本。


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 
评论(1)

你可以使用迭代器来制作。

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

好运。

评论(0)
char* result = strcpy((char*)malloc(str.length()+1), str.c_str());
评论(0)

另外,你也可以使用向量来获得一个可写的char*,如下所示。

//this handles memory manipulations and is more convenient
string str;
vector  writable (str.begin (), str.end) ;
writable .push_back ('\0'); 
char* cstring = &writable[0] //or &*writable.begin () 

//Goodluck  
评论(2)

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")
评论(1)

这也可以


std::string s;
std::cout
评论(0)

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

std::string str = "string";
auto cstr = std::make_unique(str.length() + 1);
strcpy(cstr.get(), str.c_str());
评论(0)