Подтвердить что ты не робот

Как преобразовать std::string в const char *?

Возможный дубликат:
Преобразовать std::string в const char * или char *

void Foo::bar(const std::string& foobar) {
    // ...
    const char* foobar2 = (char*)foobar;
    // ...
}

Это не работает, и я получаю сообщение об ошибке при компиляции недопустимого кастинга.

Есть ли другой способ преобразования std::string в const char*?

4b9b3361

Ответ 2

std::string::c_str() получает указатель const char* к массиву символов, который представляет строку (завершение с нулевой отметкой).

Вам не следует манипулировать данными, на которые указывает этот указатель, поэтому, если вам нужно это сделать, скопируйте данные.

Двойное редактирование - сделайте это в режиме более С++

Так как лучше избегать использования необработанных указателей и массивов, где это возможно, вы также можете получить данные в std::vector<char>

#include <string>
#include <vector>

int main()
{
    std::string str = "Hello";
    std::vector<char> cvec(str.begin(), str.end()); 

    // do stuff
}

изменить это больше похоже на C, поскольку он использует необработанные указатели и явно выделяет mem

#include <string>
#include <cstring>

int main()
{
    std::string str = "Hello";
    char *cptr = new char[str.size()+1]; // +1 to account for \0 byte
    std::strncpy(cptr, str.c_str(), str.size());

    // do stuff...
    delete [] cptr;
}

Ответ 3

Здесь вы получите много некорректных ответов о str.c_str().:) Хотя c_str() действительно полезен, имейте в виду, что это фактически не преобразует строку в char*, а вернет содержимое строки как const char*. И это большая разница!

Важно то, что указатель, который вы получаете из c_str(), действителен только до тех пор, пока существует данный объект string. Так что это будет ужасно неправильно:

class Something {
    const char* name;
public:
    Something(const std::string& pname) {
        this->name = pname.c_str(); /* wrong! the pointer will go wrong as the object from the parameter ceases to exist */
    }
};

Итак, если вы хотите конвертировать, как в: создать новое значение, которое не зависит от оригинала std::string, тогда вы захотите сделать что-то вроде этого:

char* convert(const std::string& str) {
    char* result = new char[str.length()+1];
    strcpy(result,str.c_str());
    return result;
}

Но все же c_str() вам будет достаточно в большинстве случаев. Просто попробуйте подумать о сроках жизни объектов.

Ответ 4

const char* foobar2 = foobar.c_str();

Обратите внимание на const. В противном случае вы должны скопировать его в буфер char.