从"常量字符*"到"字符*"的转换无效

invalid conversion from 'const char*' to 'char*'

本文关键字:字符 转换 无效 常量      更新时间:2023-10-16

有一个如下所示的代码。我在传递参数时遇到问题。

stringstream data;
char *addr=NULL;
strcpy(addr,retstring().c_str());

retstring() 是一个返回字符串的函数。

//more code
printfunc(num,addr,data.str().c_str());

我收到错误

从"常量字符*"

到"字符*"的转换无效。

初始化函数的参数 3 上的参数 'void Printfunc(int, char*, char*)'

在上面的一行。调用该函数如下所示

void Printfunc(int a, char *loc, char *stream)

如果我需要更改任何初始化,请告诉我。

好吧,data.str().c_str()会产生一个char const*但你的函数Printfunc()想要char* s。 根据名称,它不会更改参数,而只是打印它们和/或使用它们来命名文件,在这种情况下,您可能应该将声明修复为

void Printfunc(int a, char const* loc, char const* stream)

另一种方法是将char const*变成char*但最好修复声明:

Printfunc(num, addr, const_cast<char*>(data.str().c_str()));

string::c.str()返回一个类型 const char * 的字符串,如下所示

快速修复:尝试铸造printfunc(num,addr,(char *)data.str().c_str());

虽然上述方法可能有效,但它是未定义的行为,并且不安全。

这是使用模板的更好解决方案:

char * my_argument = const_cast<char*> ( ...c_str() );
<</div> div class="answers">

首先是这个代码片段

char *addr=NULL;
strcpy(addr,retstring().c_str());

无效,因为您没有在要复制 retstring().c_str() 的位置分配内存。

至于错误消息,那就很清楚了。表达式 data.str().c_str() 的类型是 const char *,但函数的第三个参数声明为 char *。不能将 const char * 类型的对象分配给 char * 类型的对象。如果函数不更改第三个参数指向的对象,则应将第三个参数定义为 const char *,或者您不能传递 const char * 类型的参数。

c_str() 会给你一个常量字符 *

要将 const char * 转换为 char *,您可以像这样使用 strdup。

char * success = strdup(data.str().c_str());

此外,它还将创建一个新的 malloc,因此它会创建一个副本。

所以你需要这样做

char * success = strdup(data.str().c_str());
printfunc(num, addr, success);
free(success);