如何将const char *转换为char *

时间:2009-05-07 05:41:55

标签: 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;
}

6 个答案:

答案 0 :(得分:14)

这里有一些我不明白的事情。我看到它标记为C++/CLI,但我在下面描述的内容应与Standard C++相同。

不编译

您提供的代码无法编译; get_error_from_header未指定返回类型。在我的实验中,我做了返回类型size_t

C ++ strstr()

的签名

标准C库中strstr()的签名是:

char *
strstr(const char *s1, const char *s2);

C++ librarystrstr()的签名取决于过载,是以下之一:

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<>鼓励

正如在另一个答案中指出的那样,你应该使用if (strstr(reinterpret_cast<const char *>(ptr), "550") != NULL) { ... } 而不是C风格的演员表:

const_cast<>

使用const去除const

考虑到问题中的示例,我没有看到这是必要的,但是如果你有一个需要删除const_cast<>的变量,你应该使用const char * p1; char * p2; p2 = const_cast<char *>(p1); 运算符。如:

const_cast<>

正如评论中指出的那样,使用const_cast<>运算符的原因是作者的意图是明确的,并且还使搜索{{1}}的使用变得容易;通常剥离const是错误的来源或设计缺陷。

答案 1 :(得分:9)

您似乎没有在该功能的其余部分使用err,那么为什么还要创建呢?

if (NULL != strstr((const char *)ptr, "550"))
{

如果你确实需要它,你真的需要修改它指向的任何东西吗?如果没有,则将其声明为const

const char* err = strstr((const char *)ptr, "550");

最后,由于演员阵容是如此令人讨厌的事情,最好使用特定的现代风格演员表来进行你想要的演出。在这种情况下:

if (NULL != strstr(reinterpret_cast<const char *>(ptr), "550"))
{

答案 2 :(得分:8)

你不能这样做:

char* err = strstr((char *)ptr,"550");

错误是因为如果你将const char *传递给strstr,你会得到一个(因为重载)。

答案 3 :(得分:2)

//试试这个:

const char* mstr="";
char* str=const_cast<char*>(mstr);

答案 4 :(得分:0)

ptr(你把它作为void *传入)实际上是const还是不是? (换句话说,是你控制的内存吗?)如果不是,那么在调用strstr时将其转换为char *而不是const char *。但是,如果它是,你将得到一个const char * out(指向ptr指向的字符串内的一个位置),然后需要strncpy到另一个你负责管理的字符串。

答案 5 :(得分:0)

根据我的深入研究,我发现许多论坛都没有直接解决方案或对此问题的参考答案,然后我深入研究了 GCC 在线文档,简要阅读了他们的编译器正确文档,这就是我可以提供的.

在 GNU C 中,指向带有限定符的数组的指针的工作方式类似于指向其他限定类型的指针。例如,int ()[5] 类型的值可用于初始化 const int ()[5] 类型的变量。然而,这些类型在 ISO C 中不兼容,因为 const 限定符正式附加到数组的元素类型而不是数组本身。

如果我们接受这个描述可能会更好地理解

extern void
transpose (int N, int M, double out[M][N], const double in[N][M]);
double x[3][2];
double y[2][3];
…
transpose(3, 2, y, x);

观察以上是如果你有一个

s1=createStudent(s1, 123, "Poli");
s2=createStudent(s2, 456, "Rola);

“Poli”和“Rola”的 const char[5] 都与 char a[] 相关。这是绝对不允许的,因为每个元素都附加了限定符,而不是整个数组作为常量。