C++ 如何将常量字符*转换为字符*

C++ 如何将常量字符*转换为字符*,c++,C++,谁能告诉我如何把常量字符*转换成字符* 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) {

谁能告诉我如何把常量字符*转换成字符*

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;
}
你就不能这样做:

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

这个错误是因为如果您将一个const char*传递给strstrstr,您就会得到一个(因为重载)

您似乎没有在该函数的其余部分使用
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"))
{
if(NULL!=strstrstr(重新解释强制转换(ptr),“550”))
{

那么ptr(作为void*传入)是否实际为常量?(换句话说,内存是否在您的控制之下?)如果不是,则在调用strstr时将其转换为char*而不是const char*。但是,如果是,您将得到一个const char*(指向ptr指向的字符串内部的位置),然后将需要输出到您负责管理的另一个字符串。

这里有一些事情我不明白。我看到这是标记的,但我在下面描述的内容应该与相同

不编译 您给出的代码没有编译;
get\u error\u from\u header
没有指定返回类型。在我的实验中,我创建了返回类型
size\u t

C++签名>代码> STRSTRESE()/<代码> 标准C库中的
strstr()
的签名为:

char *
strstr(const char *s1, const char *s2);
但是中的
strstr()
的签名取决于重载,是以下之一:

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
不必要 正如前面的回答中所指出的,如果只用于检查
NULL
,则使用
err
存储
strstr
的结果是不必要的。因此,您可以使用:

if (strstr((const char *)ptr, "550") != NULL) {
    ...
}
鼓励使用
reinterpret\u cast
正如在另一个答案中所指出的,您应该使用
重新解释\u cast
而不是C型类型转换:

if (strstr(reinterpret_cast<const char *>(ptr), "550") != NULL) {
    ...
}
正如在一篇评论中指出的,使用
const_cast
运算符的原因是为了让作者的意图明确,同时也为了便于搜索
const_cast
;通常剥离const是bug或设计缺陷的根源。

//尝试以下方法:

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

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

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

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

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”的常量char[5]都与char a[]相关。这是严格不允许的,因为每个元素都附加了限定符,而不是作为常量的整个数组。

我认为“const char**to char*”这只是一个输入错误。我同意如果从未使用过变量,那么创建变量就没有意义。所以我基本上同意你的“不必要的常量”代码,只是我不清楚重新解释的好处。你引用的是strtr()的签名从C,而不是C++。使用COSTOSTCAST的另一个原因是,它更容易搜索。关键字您可以找到开发人员更改constness的所有位置。这很好,因为constness更改通常是问题/bug的来源。重新解释\u cast的好处是void*ptr不能作为char*参数(const或not)此外,在C++中,使用C++操作符,如RealExtType,而不是C样式的CAST,可以让您知道原始作者的意图在铸造中是什么,并且能够搜索这样的铸件。@ MsAlter提到我引用STRSTREST()的签名。从C,而不是C++,C++的签名是什么?这是一个C++/CLI的区别,在C++中,它的签名与C?真的有不同的签名。这取决于他最终会如何处理它(目前除了检查null之外什么都没有)。
s1=createStudent(s1, 123, "Poli");
s2=createStudent(s2, 456, "Rola);