c++ - 如何将 const char* 转换为 char*

标签 c++

谁能告诉我如何将 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/

相关文章:

c++ - 匹配()的Rcpp编译错误

c++ - 模板函数和 boost::remove_reference

c++ - N 选择 k 为大 n 和 k

C++ 比 fgetc 更好的东西?

c++ - 有什么方法不需要在 Xcode 中使用文件的完整路径? [C/C++]

原生 C++ 类的 C# 包装器

c++ - 查看固定长度数组之间有多少字节相等的最快方法

c++ - 在字符串/字符数组中捕获串行输入

c++ - 使用 Bison/Antlr/Packrat/Elkhound/编写的 LLVM JIT 解析器

c++ - 为什么这些模板化函数不能不带参数?