2012-04-22 143 views
0

是否有可能做到这一点C++返回字符串

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但我需要它只有在代码(块没有新/删除)。从方法返回字符串后,它查找引用(如果不能找到它,删除字符串),然后调用c_str()。我有很多char(独立于我),我可以使用第二种解决方案,但它需要太多的代码。

+0

请使用内联代码语法('\'\'')将代码缩进4个空格,而不是将每行标记为代码! – 2012-04-22 17:00:14

+0

^即突出显示所有内容,然后按ctrl-K或点击代码格式按钮 – chris 2012-04-22 17:03:53

+0

您的'str'功能是不需要的。你只是为了缩短代码吗? – 2012-04-22 17:16:03

回答

6

如果你使用第二个选项 -

std::string temp = str("asd"); 
char* strz = (char*)temp.c_str(); 

你可能运行到未定义行为。修改strz的内容是非法的。您必须使用strcpy才能获得可变数组char's。你的第一个也不会更好,此外,这是多余的,因为你可以直接使用string的构造函数。

总之,要获得从string你可以做一个char*

char* get(const std::string& str) 
{ 
    char* ret = new char[str.length() + 1](); 
    strcpy(ret,str.c_str()); 
    return ret; 
} 

当你用它做你必须delete[]记录自己。

+0

我只需要暂时使用此转换(甚至不可写入),稍后将其复制(但从char *复制) – user1112008 2012-04-22 17:09:44

+2

@ user1112008如果它不可写,为什么不用'const char *'? – 2012-04-22 17:10:25

+0

正如我告诉它是独立于我:(我可以编辑结构,它保存在“我的身边”,但在“另一端”它将被读为char *'。我正在写现有应用程序的扩展(发送是同步的)。 – user1112008 2012-04-22 17:12:37

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 
1

让我猜猜,你要问和回答的是什么:)随意忽视,如果我猜错了:)

所以,你有一些函数,返回std::string

std::string str(...); 

而且你有一个使用一些旧代码(太旧,甚至不声明其参数为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()返回值)。令人讨厌的是,它可能有时似乎工作。