Искам да преобразувам std::string в тип данни **char* или char[]**.
std::string str = "string";
char* chr = str;
Резултатите са: "грешка: не може да конвертира 'std::string' в 'char' ... ".
Какви методи има за това?
Той няма да се конвертира автоматично (слава Богу). Ще трябва да използвате метода c_str()
, за да получите версията на символен низ на C.
std::string str = "string";
const char *cstr = str.c_str();
Обърнете внимание, че този метод връща const char *
; не е позволено да променяте низ в стил C, върнат от c_str()
. Ако искате да го обработите, ще трябва първо да го копирате:
std::string str = "string";
char *cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());
// do stuff
delete [] cstr;
Или на съвременен език C++:
std::vector<char> cstr(str.c_str(), str.c_str() + str.size() + 1);
Ако искате само низ в стил С, представящ същото съдържание:
char const* ca = str.c_str();
Ако искате низ в стил C с ново съдържание, един от начините (при положение, че не знаете размера на низа по време на компилация) е динамичното разпределение:
char* ca = new char[str.size()+1];
std::copy(str.begin(), str.end(), ca);
ca[str.size()] = '\0';
Не забравяйте да го изтриете[]
по-късно.
Ако вместо това искате статично разпределен масив с ограничена дължина:
MAX = 80; // максимален брой знаци
char ca[MAX] = {};
std::copy(str.begin(), (str.size() >= MAX ? str.begin() + MAX : str.end()), ca);
std::string
не преобразува имплицитно тези типове по простата причина, че нуждата да се прави това обикновено е миризма на дизайн. Уверете се, че това наистина ви е необходимо.
Ако определено се нуждаете от char*
, добрият начин вероятно е:
vector<char> v(str.begin(), str.end());
char* ca = &v[0]; // pointer to start of vector