c++ 从“const char*”到“char*”的转换无效

bz4sfanl  于 2022-12-24  发布在  其他
关注(0)|答案(4)|浏览(364)

有一个代码如下所示。我有问题,通过参数。

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

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

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

我得到了错误
从"const char *"到"char *"转换无效。
正在初始化函数参数3上的"void Printfunc(int,char *,char *)"的参数3
在上面的行中。该函数的调用如下所示

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

请让我知道如果我需要改变任何初始化.

os8fio9y

os8fio9y1#

data.str().c_str()产生一个char const*,但是你的函数Printfunc()想要有char*。基于名称,它不改变参数,而只是打印它们和/或使用它们来命名文件,在这种情况下,你可能应该把你的声明修改为

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

替代方法可能是将char const*转换为char*,但最好修复声明:

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

0s7z1bwu2#

string::c.str()返回const char *类型的字符串,如here所示
快速解决方案:试浇铸printfunc(num,addr,(char *)data.str().c_str());

虽然上述方法可行,但这是不确定的行为,而且不安全。

下面是一个使用模板的更好的解决方案:

char * my_argument = const_cast<char*> ( ...c_str() );
x8diyxa7

x8diyxa73#

首先这个代码片段

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

是无效的,因为您没有分配要复制retstring().c_str()的内存。
至于错误信息,那么它是足够清楚的。表达式数据的类型。str().c_字符串()为const char *,但函数的第三个参数被声明为char *。不能将const char * 类型的对象赋给char * 类型的对象。函数应将第三个参数定义为const char * 如果它不更改第三个参数所指向的对象,或者您不能传递类型为const char * 的参数。

ppcbkaq5

ppcbkaq54#

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);

相关问题