[英]C++ returning string
是否有可能做到这一点
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(独立于我),我可以使用第二种解决方案,但是它需要太多代码。
如果您使用第二个选项-
std::string temp = str("asd");
char* strz = (char*)temp.c_str();
您可能会遇到未定义的行为 。 修改strz
的内容是strz
。 您必须使用strcpy
来获取可变的char
数组。 您的第一个也不是更好,而且,它是多余的,因为您可以直接使用string
的构造函数。
无论如何,要从string
获取char*
,您可以执行以下操作:
char* get(const std::string& str)
{
char* ret = new char[str.length() + 1]();
strcpy(ret,str.c_str());
return ret;
}
完成后,您必须自己delete[]
内存。
除了从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
让我猜你想问和回答的问题:)如果我猜错了,请随意忽略:)
因此,您有一些函数返回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);
}
这是非法代码(例如,在调用ugly_func1
之前销毁str()
的返回值)。 令人讨厌的是,它有时可能会起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.