0

是否有可能做到这一点

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

4

3 回答 3

6

如果您使用第二个选项 -

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

您可能会遇到未定义的行为。修改内容是违法的strz。您必须使用strcpy来获得一个可变的char's 数组。你的第一个也好不到哪里去,而且,它是多余的,因为你可以直接使用string' 构造函数。

无论如何,char*要从中获得 astring你可以这样做:

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

delete[]当你完成它时,你必须自己去记忆。

于 2012-04-22T17:02:38.947 回答
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
于 2012-04-22T17:13:45.237 回答
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)。令人讨厌的是,它有时可能会起作用。

于 2012-04-22T17:24:36.740 回答