Ответ 1
Используйте foobar.c_str()
.
Вы можете найти эту ссылку полезной: http://www.cppreference.com/wiki/string/start
Возможный дубликат:
Преобразовать std::string в const char * или char *
void Foo::bar(const std::string& foobar) {
// ...
const char* foobar2 = (char*)foobar;
// ...
}
Это не работает, и я получаю сообщение об ошибке при компиляции недопустимого кастинга.
Есть ли другой способ преобразования std::string
в const char*
?
Используйте foobar.c_str()
.
Вы можете найти эту ссылку полезной: http://www.cppreference.com/wiki/string/start
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;
}
Здесь вы получите много некорректных ответов о 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()
вам будет достаточно в большинстве случаев. Просто попробуйте подумать о сроках жизни объектов.
const char* foobar2 = foobar.c_str();
Обратите внимание на const. В противном случае вы должны скопировать его в буфер char.