2010-03-09 38 views
4

Visual Studio C++ 2005Невозможно преобразовать const char * в 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 как сопзЬ, а?

Большое спасибо,

ответ

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 * в качестве первого параметра, эта версия также возвращаетconst char *, так что вы должны изменить свое возвращаемое значение, чтобы соответствовать.

2

Так почему бы мне нужно объявить end_ptr как сопзЬ, а?

По той же причине, что 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++ приведенный выше код не скомпилирован, и ваш примерный код тоже.

Смежные вопросы