C++ 从';常量字符*';至';字符*';

C++ 从';常量字符*';至';字符*';,c++,C++,有一个如下所示的代码。我无法传递论点 stringstream数据; 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 在上面一行。

有一个如下所示的代码。我无法传递论点

stringstream数据;
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)
如果需要更改任何初始化,请告诉我。

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

快速修复方法:尝试强制转换printfunc(num,addr,(char*)data.str().c_str())

尽管上述方法可行,但它是未定义的行为,不安全。

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

char * my_argument = const_cast<char*> ( ...c_str() );
char*my_argument=const_cast(…c_str());
好吧,
data.str().c_str()
会产生一个
char常量*
,但是你的函数
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()));
Printfunc(num,addr,const_cast(data.str().c_str());

首先是这些代码片段

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*类型的参数

编译器希望您将char*stream更改为const char*stream下面的答案处理编译错误,但您还需要分配一些内存对于传递给strcpy的目标缓冲区-您不能仅仅通过空指针,因为调用
data.str().c_str()
的目标参数可能会产生令人惊讶的结果。@Chad您是对的。。什么应该起作用,不是吗。。。无论如何,这并不可靠。第一个问题是使用强制转换来删除常量。第二个问题是使用C风格的演员阵容。谢谢,我已经生锈了。我将更新我的解决方案。OP指的是@Dietmar的responseIt未定义的行为,C样式的演员阵容并不能真正消除字符串的“常量”。@CaptainObvlious:你能解释一下原因吗?模板一可以正常工作。这可能是最安全的解决方案了!在C库中,函数通常希望将
char*
(或int*,float*,等等)作为参数,尽管
const char*
更合适,因为函数不尝试修改参数。在这种情况下(它们是标准而不是例外),您别无选择,只能使用
const\u cast()
删除常量。我可以很容易地打赌,如果C/C++有一种不那么冗长的方法来声明函数中的常量参数,开发人员就不会避免它们。