Как преобразовать 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 из другой строки, за которую вы отвечаете за управление.