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?
非常感谢,
答案 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_ptr
为const 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 ++中,上面的代码无法编译,您的示例代码也是如此。