std :: string to char *

时间:2011-09-08 17:25:23

标签: c++ string char

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

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

结果:“错误:无法将'std :: string'转换为'char'......”

有哪些方法可以做到这一点?

18 个答案:

答案 0 :(得分:578)

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

答案 1 :(得分:128)

More details herehere但您可以使用

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

答案 2 :(得分:36)

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

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

以后:

free(chr); 

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

分配参数

答案 3 :(得分:21)

(此答案仅适用于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*

答案 4 :(得分:13)

  • 如果您只想要一个代表相同内容的C风格字符串:

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

    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不会隐式转换为这些类型,原因很简单,需要这样做通常是设计气味。确保确实需要它。

如果您肯定需要char*最佳方式可能是:

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

答案 5 :(得分:10)

这对bobobobo的答案评论会更好,但我没有这个代表。它完成了同样的事情,但有更好的实践。

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

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

请注意,会为您提供数据副本;它会给你一个指向字符串的指针。因此,如果您修改chr元素,则修改str

答案 6 :(得分:6)

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

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

要从char *获得非常量std::string,可以使用data()成员函数,该成员函数从C ++ 17开始返回非常量指针:

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

对于该语言的较早版本,可以使用范围构造将字符串复制到向量中,从该向量中可以获取非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结尾。

答案 7 :(得分:5)

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

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

答案 8 :(得分:5)

要严格迂腐,你不能“将std :: string转换为char *或char []数据类型。”

正如其他答案所示,您可以将std :: string的内容复制到char数组中,或者将const char *复制到std :: string的内容中,以便您可以在“ C风格“。

如果您正在尝试更改std :: string的内容,则std :: string类型具有执行任何可能需要执行的操作的所有方法。

如果你试图将它传递给一个带char *的函数,那就是std :: string :: c_str()。

答案 9 :(得分:4)

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

答案 10 :(得分:4)

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

答案 11 :(得分:3)

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

答案 12 :(得分:3)

您可以使用迭代器制作它。

std::string str = "string";
std::string::iterator p=str.begin();
char* chr = &(*p);
祝你好运。

答案 13 :(得分:3)

或者,您可以使用向量来获取可写的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  

答案 14 :(得分:2)

使用unique_ptr安全版orlp的char *:

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

答案 15 :(得分: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")

答案 16 :(得分:2)

这也可行

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;  

答案 17 :(得分:1)

没有人提到sprintf吗?

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