2010-03-09 68 views
4

Visual Studio C++ 2005無法將常量字符*轉換爲char *

我在此代碼的最後一行出現錯誤。

int Utils::GetLengthDiff (const char * input, int & num_subst) 
{ 
    int num_wide = 0, diff = 0 ; 
    const char * start_ptr = input ; 

    num_subst = 0 ; 
    while ((start_ptr = strstr (start_ptr, enc_start)) != NULL) 
    { 
     char * end_ptr = strstr (start_ptr, enc_end); // Error 

所以我改了行,以這一點,它的工作確定

const char * end_ptr = strstr (start_ptr, enc_end); 

那麼,爲什麼我需要聲明end_ptr作爲一個const呢?

非常感謝,

回答

13

C++有兩個重載版本的這個函數。 http://www.cplusplus.com/reference/clibrary/cstring/strstr/

const char * strstr (const char * str1, const char * str2); 
     char * strstr (  char * str1, const char * str2); 

由於您start_ptrconst char * C++編譯器解析調用了使用const char *作爲第一個參數的版本,該版本還回報一個const char *,所以你必須改變你的返回值相匹配。

2

那麼,爲什麼我需要聲明end_ptr作爲一個const呢?

出於同樣的原因,start_ptr需要是const char*:因爲它搜索字符串常量內strstr返回類型const char*(= char const*)(傳遞strstr參數也const char*)。尤其是而不是指針是const,這是它指向的內存。把它看作是一個指向不可變(即不變)字符串的指針。你可以改變它指向的內容,但不是字符串內的單個字符。

這不同於指向可變字符串的不可更改指針,即可以更改單個字符的字符串。

1

假設從strstr的返回值分別爲char*,具有const char*第一個參數,因爲它是在C.然後,你可以寫:

const char *s = "hello, world"; 
strstr(s, "hello")[0] = 'j'; 

的代碼將編譯並運行(與未定義行爲),但這是const專門爲避免的那種錯誤。您已將const char*轉換爲char*而無法投射。

C無法對它做任何事情:如果strstr返回const char*那麼在輸入非常量並且想要修改字符串的情況下,您必須明確地強制轉換回非const。因爲C++有函數重載它可以(並且確實)堵塞漏洞,並使兩種情況都正常工作。因此,在C++中,上面的代碼無法編譯,您的示例代碼也是如此。