任何人都可以告诉我如何将const char*转换为char*?
get_error_from_header(void *ptr, size_t size, size_t nmemb, void *data) {
ErrorMsg *error = (ErrorMsg *)data;
char* err = strstr((const char *)ptr,"550");
//error cannot convert const char** to char*
if(err) {
strncpy(error->data,(char*)ptr,LENGTH_ERROR_MESSAGE-1);
error->data[LENGTH_ERROR_MESSAGE-1] = '\0';
error->ret = true;
}
return size*nmemb;
}
Run Code Online (Sandbox Code Playgroud)
Jar*_*aus 14
这里有一些我不明白的事情.我看到它被标记为C++/CLI,但我在下面描述的应该与标准C++相同.
你提供的代码不能编译; get_error_from_header没有指定返回类型.在我的实验中,我做了返回类型size_t.
strstr()strstr()标准C库中的签名是:
char *
strstr(const char *s1, const char *s2);
Run Code Online (Sandbox Code Playgroud)
但对于签名strstr()在C++库,这取决于过载,是以下之一:
const char * strstr ( const char * str1, const char * str2 );
char * strstr ( char * str1, const char * str2 );
Run Code Online (Sandbox Code Playgroud)
我会选择第一个重载,因为你不想修改字符串,你只想读它.因此,您可以将代码更改为:
const char* err = strstr((const char *)ptr, "550");
if (err != NULL) {
...
}
Run Code Online (Sandbox Code Playgroud)
另外,我假设您的评论报告错误:
//error cannot convert const char** to char*
Run Code Online (Sandbox Code Playgroud)
是一个错字:没有const char**被人看到.
err不必要的正如在前面的答案中所指出的,如果用于检查err结果,strstr则不必使用存储结果NULL.因此你可以使用:
if (strstr((const char *)ptr, "550") != NULL) {
...
}
Run Code Online (Sandbox Code Playgroud)
reinterpret_cast<>鼓励正如在另一个答案中指出的那样,你应该使用reinterpret_cast<>而不是C风格的演员表:
if (strstr(reinterpret_cast<const char *>(ptr), "550") != NULL) {
...
}
Run Code Online (Sandbox Code Playgroud)
const_cast<>剥离使用const给出问题中的示例,我没有看到这是必要的,但如果你有一个需要const去除-ness 的变量,你应该使用const_cast<>运算符.如:
const char * p1;
char * p2;
p2 = const_cast<char *>(p1);
Run Code Online (Sandbox Code Playgroud)
正如评论中指出的那样,使用const_cast<>运算符的原因是作者的意图是明确的,并且也使搜索的使用变得容易const_cast<>; 通常剥离const是错误的来源或设计缺陷.
您似乎没有err在该功能的其余部分中使用,为什么还要创建它?
if (NULL != strstr((const char *)ptr, "550"))
{
Run Code Online (Sandbox Code Playgroud)
如果你确实需要它,你真的需要修改它指向的东西吗?如果没有,则将其声明为const:
const char* err = strstr((const char *)ptr, "550");
Run Code Online (Sandbox Code Playgroud)
最后,由于演员阵容是如此令人讨厌的东西,最好使用特定的现代风格演员表来进行你想要的演出.在这种情况下:
if (NULL != strstr(reinterpret_cast<const char *>(ptr), "550"))
{
Run Code Online (Sandbox Code Playgroud)
你不能这样做:
char* err = strstr((char *)ptr,"550");
Run Code Online (Sandbox Code Playgroud)
错误是因为如果你将一个const char*传递给strstr,你会得到一个(因为过载).
小智 5
//试试这个:
const char* mstr="";
char* str=const_cast<char*>(mstr);
Run Code Online (Sandbox Code Playgroud)