谁能告诉我如何将 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;
}
最佳答案
这里有一些我不明白的地方。我看到这被标记为 C++/CLI , 但我下面描述的应该和 Standard C++ 一样.
不编译
您提供的代码无法编译; get_error_from_header
没有指定返回类型。在我的实验中,我设置了返回类型 size_t
.
C++ 签名 strstr()
strstr()
的签名在标准 C 库中是:
char *
strstr(const char *s1, const char *s2);
但是 strstr()
的签名在 C++ library ,取决于过载,是以下之一:
const char * strstr ( const char * str1, const char * str2 );
char * strstr ( char * str1, const char * str2 );
我会选择第一个重载,因为你不想修改字符串,你只想读取它。因此,您可以将代码更改为:
const char* err = strstr((const char *)ptr, "550");
if (err != NULL) {
...
}
另外,我假设您的评论报告了错误:
//error cannot convert const char** to char*
是一个错字:没有const char**
待见。
分配给 err
不必要的
正如前面的回答中所指出的,使用 err
存储 strstr
的结果如果它只用于检查 NULL
,则没有必要.因此您可以使用:
if (strstr((const char *)ptr, "550") != NULL) {
...
}
使用reinterpret_cast<>
鼓励
正如另一个答案中指出的,您应该使用 reinterpret_cast<>
而不是 C 风格的类型转换:
if (strstr(reinterpret_cast<const char *>(ptr), "550") != NULL) {
...
}
使用const_cast<>
剥离const
鉴于问题中的示例,我看不出这在哪里是必要的,但如果您有一个变量需要删除 const
-ness,你应该使用 const_cast<>
运算符(operator)。如:
const char * p1;
char * p2;
p2 = const_cast<char *>(p1);
正如评论中指出的,使用 const_cast<>
的原因运算符是为了让作者的意图明确,也为了方便搜索const_cast<>
的使用。 ;通常剥离 const 是错误或设计缺陷的根源。
关于c++ - 如何将 const char* 转换为 char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/833034/