如何在C++中将字符串转换为char*?

22
我在我的程序中遇到了一个错误:“无法将字符串转换为char*”。我该如何执行此转换?

没有一个回答实际问题。 - John Dibling
7个回答

28
如果您可以接受一个const char*,您只需要调用它的c_str()方法即可:
const char *mycharp = mystring.c_str();

如果你真的需要一个可修改的char*,你需要复制字符串缓冲区。使用vector是处理这种情况的理想方式:
std::vector<char> v(mystring.length() + 1);
std::strcpy(&v[0], mystring.c_str());
char* pc = &v[0];

15

使用str.c_str()来获取const char*

const char *pch = str.c_str();
请注意,生成的const char*只在str被更改或销毁之前有效。
然而,如果你真的需要一个非const的,你可能不应该使用std::string,因为它不是为了允许在其背后更改其基础数据而设计的。尽管如此,您可以通过调用&str[0]&* str.begin()来获取指向其数据的指针。
这种方法的丑陋应该被视为一个特性。在C++98中,甚至不要求std::string将其数据存储在连续的内存块中,因此这可能会导致程序崩溃。我认为这已经改变了,但我甚至不能记得这是针对C++03还是即将到来的下一个标准版本C++1x的。
如果您需要这样做,请考虑使用std::vector<char>。您可以使用相同的方式访问其数据:&v[0]&*v.begin()

9
//assume you have an std::string, str. 
char* cstr = new char[str.length() +1]; 
strcpy(cstr, str.c_str()); 

//eventually, remember to delete cstr
delete[] cstr; 

3

如果你想从一个 string 转换成一个 char*(即不是 const char*),你可以这样做,但要小心:这里有险情:

string foo = "foo";
char* foo_c = &foo[0];

如果你尝试修改字符串的内容,你必须自行承担责任。


问题不仅仅是修改内容——字符串的内容并没有保证是连续的,所以可能根本无法工作。 - CiscoIPPhone
我可能错了,根据这个问题的被接受的答案,在新标准中它保证是连续的:https://dev59.com/9nI-5IYBdhLWcg3wKVA9 - CiscoIPPhone

3

使用string对象的c_str()方法来获取const char*指针。警告:如果修改或销毁string对象,则返回的指针将不再有效。


2
如果const char*适合您的需求,请使用此代码:myString.c_str() 如果您确实需要char*,并且确定char*不会更改,则可以使用此代码:const_cast<char*>(myString.c_str()) 如果char*可能会更改,则需要将字符串复制到其他地方并使用该位置。这个位置可以是std::vectornew char[],具体取决于您的需求。

1

std::string::c_str()会返回一个与string对象内容相同的C字符串。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接