是否可以这样做
std::string str(const char* s)
{
return std::string(s);
}
int main() {
char* strz = (char*)str("asd").c_str();
}
而不是:
int main(){
std::string temp = str("asd");
char* strz = (char*)temp.c_str();
}
我知道它应该是const char* strz
但我只需要在代码块内(并且没有new / delete)。从方法返回字符串后,它会查找引用(如果无法找到它,删除字符串),然后调用c_str()
。我有很多char(独立于我),我可以使用第二种解决方案,但需要太多代码。
答案 0 :(得分:6)
如果您使用第二个选项 -
std::string temp = str("asd");
char* strz = (char*)temp.c_str();
您可能遇到未定义的行为。修改strz
的内容是违法的。您必须使用strcpy
来获取char
的可变数组。你的第一个也不是更好,而且,它是多余的,因为你可以直接使用string
的构造函数。
无论如何,要从char*
获得string
,您可以这样做:
char* get(const std::string& str)
{
char* ret = new char[str.length() + 1]();
strcpy(ret,str.c_str());
return ret;
}
当你完成记忆时,你必须自己delete[]
。
答案 1 :(得分:1)
除了从const char *到char *
的演员之外,还有一个问题char* strz = (char*)str("asd").c_str();
这会创建一个临时的std :: string,它会在此行的末尾被销毁。这使char * strz无效。
听起来我应该只是坚持返回的std :: string而不是将其视为临时的:
std::string strz = str("asd");
...
foo(strz.data()); // use strz
答案 2 :(得分:1)
让我猜猜你想问什么并回答:)如果我猜错了,请随意忽略:)。
所以你有一些函数返回std::string
:
std::string str(...);
你有一些使用char*
的旧代码(很老,以至于它甚至没有将其参数声明为const char*
,即使它没有修改字符串),你想要使用结果:
int ugly_func1(char*) {...}
int ugly_func2(char*) {...}
int ugly_func3(char*) {...}
int main()
{
std::string temp = str(...);
char* temp1 = (char*)temp.c_str();
ugly_func1(temp1);
ugly_func2(temp1);
ugly_func3(temp1);
}
所以,不,你必须使用temp变量的语法。你不能写这个:
int main()
{
char* temp = (char*)str(...).c_str();
ugly_func1(temp);
ugly_func2(temp);
ugly_func3(temp);
}
这是非法代码(例如,在调用str()
之前销毁ugly_func1
的返回值)。令人讨厌的是它有时似乎有效。