无法将const char *转换为char *

时间:2010-03-09 09:42:16

标签: c++ visual-studio-2005

Visual Studio c ++ 2005

我在此代码的最后一行收到错误。

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?

非常感谢,

3 个答案:

答案 0 :(得分: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 *作为第一个参数的版本,该版本也返回 a { {1}},因此您必须更改您的返回值才能匹配。

答案 1 :(得分:2)

  

那么为什么我还需要将end_ptr声明为const?

出于同样的原因start_ptr需要const char*strstr返回类型const char*(= char const*),因为它在常量字符串中搜索(您将传递给 strstr的参数也是const char*)。特别是,不是指针const,它指向的是内存。可以将其视为指向不可变(即常量)字符串的指针。您可以更改它指向的内容,但不能更改字符串中的单个字符。

这与指向可变字符串的不可更改指针不同,即可以更改单个字符的字符串。

答案 2 :(得分: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并且你想要修改它时显式地转换回非const串。因为C ++有函数重载,它可以(并且确实)插入漏洞并使两个案例都能正常工作。因此,在C ++中,上面的代码无法编译,您的示例代码也是如此。