繁体   English   中英

C ++返回字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM