Могу ли я получить неконстантную строку C обратно из строки C ++? - PullRequest
23 голосов
/ 17 декабря 2009

Константность в C ++ до сих пор доставляет мне головную боль. Работая с некоторым старым кодом C, я обнаружил, что мне нужно назначить, чтобы превратить строковый объект C ++ в строку C, и присвоить его переменной. Тем не менее, переменная char * и c_str() возвращает const char []. Есть ли хороший способ обойти это, не катя мою собственную функцию, чтобы сделать это?

edit: Я также стараюсь не звонить новым. Я с удовольствием обменяю немного более сложный код на меньшие утечки памяти.

Ответы [ 12 ]

1 голос
/ 17 декабря 2009

Если c_str() возвращает вам копию внутреннего буфера строкового объекта, вы можете просто использовать const_cast<>.

Однако, если c_str() предоставляет вам прямой доступ к внутреннему буферу строковых объектов, сделайте явную копию вместо удаления константы.

0 голосов
/ 17 декабря 2009

Неужели это так сложно сделать самому?

#include <string>
#include <cstring>

char *convert(std::string str)
{
    size_t len = str.length();
    char *buf = new char[len + 1];
    memcpy(buf, str.data(), len);
    buf[len] = '\0';
    return buf;
}

char *convert(std::string str, char *buf, size_t len)
{
    memcpy(buf, str.data(), len - 1);
    buf[len - 1] = '\0';
    return buf;
}

// A crazy template solution to avoid passing in the array length
// but loses the ability to pass in a dynamically allocated buffer
template <size_t len>
char *convert(std::string str, char (&buf)[len])
{
    memcpy(buf, str.data(), len - 1);
    buf[len - 1] = '\0';
    return buf;
}

Использование:

std::string str = "Hello";
// Use buffer we've allocated
char buf[10];
convert(str, buf);
// Use buffer allocated for us
char *buf = convert(str);
delete [] buf;
// Use dynamic buffer of known length
buf = new char[10];
convert(str, buf, 10);
delete [] buf;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...