Как преобразовать const char * в 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;
}
Ответы
Ответ 1
Кажется, вы не используете 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"))
{
Ответ 2
Есть несколько вещей, которые я здесь не понимаю. Я вижу, что это помечено для С++/CLI, но то, что я описываю ниже, должно быть таким же, как Стандартный С++.
Не компилирует
Код, который вы даете, не компилируется; get_error_from_header
не задает тип возврата. В моих экспериментах я сделал возвращаемый тип size_t
.
Подпись С++ strstr()
Подписи для strstr()
в стандартной библиотеке C:
char *
strstr(const char *s1, const char *s2);
но подпись для strstr()
в С++ library, в зависимости от перегрузки, является одной из следующих:
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
для хранения результата strstr
не требуется, если все, для которого он используется, проверяет NULL
. Поэтому вы можете использовать:
if (strstr((const char *)ptr, "550") != NULL) {
...
}
Использование reinterpret_cast<>
рекомендуется
Как указано в другом ответе, вы должны использовать reinterpret_cast<>
вместо C-style cast:
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 является источником ошибок или дефектов дизайна.
Ответ 3
Не можете ли вы просто сделать:
char* err = strstr((char *)ptr,"550");
Ошибка связана с тем, что если вы передаете const char * в strstr, вы получите один (из-за перегрузки).
Ответ 4
//попробуйте это вместо:
const char* mstr="";
char* str=const_cast<char*>(mstr);
Ответ 5
Ну, это ptr (который вы передали как void *) на самом деле const или нет? (Другими словами, это память под вашим контролем?) Если это не так, то при вызове strstr приведите ее к char * вместо const char *. Если это так, вы получите const char * out (указывающий на местоположение внутри строки, на которую указывает ptr), а затем потребуется strncpy из другой строки, за которую вы отвечаете за управление.