簡體   English   中英

如何將 const char* 轉換為 char*

[英]How to convert const char* to char*

任何人都可以告訴我如何將 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 ,但我在下面描述的應該與標准 C++相同。

不編譯

您提供的代碼無法編譯; get_error_from_header不指定返回類型。 在我的實驗中,我創建了返回類型size_t

C++ strstr()簽名

標准 C 庫中strstr()的簽名是:

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

但是C++ 庫中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賦值

正如在之前的答案中指出的那樣,如果err僅用於檢查NULL則不需要使用err來存儲strstr的結果。 因此,您可以使用:

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<>運算符。 如:

const char * p1;
char * p2;

p2 = const_cast<char *>(p1);

正如評論中指出的那樣,使用const_cast<>運算符的原因是為了使作者的意圖明確,並且也便於搜索使用const_cast<> 通常剝離 const 是錯誤或設計缺陷的來源。

您似乎沒有在該函數的其余部分使用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"))
{

你不能只做:

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

錯誤是因為如果您將 const char* 傳遞給 strstr ,則會得到一個(因為過載)。

//試試這個:

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

根據我的深入研究,我發現許多論壇都沒有直接解決方案或對此問題的參考答案,然后我深入研究了 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[] 相關。 這是嚴格不允許的,因為每個元素都附加了限定符,而不是整個數組作為常量。

好吧,ptr(你作為 void* 傳入)實際上是不是 const ? (換句話說,內存是否在您的控制之下?)如果不是,則在調用 strstr 時將其轉換為 char* 而不是 const char*。 但是,如果是這樣,您將得到一個 const char* 輸出(指向 ptr 指向的字符串內部的位置),然后需要將 strncpy 輸出到您負責管理的另一個字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM