C ++返回字符串

时间:2012-04-22 16:58:33

标签: c++ string char return

是否可以这样做

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(独立于我),我可以使用第二种解决方案,但需要太多代码。

3 个答案:

答案 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的返回值)。令人讨厌的是它有时似乎有效。