Chcę przekonwertować std::string na typ danych **char* lub char[]**.
std::string str = "string";
char* chr = str;
Wyniki: "error: cannot convert 'std::string' to 'char' ... ".
Jakie metody są dostępne, aby to zrobić?
Nie będzie on automatycznie konwertowany (dzięki Bogu). Będziesz musiał użyć metody c_str()
, aby uzyskać wersję łańcuchową w języku C.
std::string str = "string";
const char *cstr = str.c_str();
Zauważ, że zwraca ona const char *
; nie wolno ci zmieniać łańcucha w stylu C zwróconego przez c_str()
. Jeśli chcesz go przetworzyć, będziesz musiał go najpierw skopiować:
std::string str = "string";
char *cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());
// do stuff
delete [] cstr;
Lub w nowoczesnym C++:
std::vector<char> cstr(str.c_str(), str.c_str() + str.size() + 1);
Jeśli chcesz tylko ciąg w stylu C reprezentujący tę samą zawartość:
char const* ca = str.c_str();
Jeśli chcesz mieć ciąg w stylu C z nową zawartością, jednym ze sposobów (biorąc pod uwagę, że nie'znasz rozmiaru ciągu w czasie kompilacji) jest dynamiczna alokacja:
char* ca = new char[str.size()+1];
std::copy(str.begin(), str.end(), ca);
ca[str.size()] = '↪Sm_2217;;
Nie zapomnij skasować[]
tego później.
Jeśli chcesz zamiast tego statycznie przydzieloną tablicę o ograniczonej długości:
size_t const MAX = 80; // maksymalna liczba znaków
char ca[MAX] = {};
std::copy(str.begin(), (str.size() >= MAX ? str.begin() + MAX : str.end()), ca);
strd::string` nie konwertuje niejawnie do tych typów z tego prostego powodu, że potrzeba zrobienia tego jest zazwyczaj zapachem projektowym. Upewnij się, że naprawdę tego potrzebujesz.
Jeśli definitywnie potrzebujesz char*
, najlepszym sposobem jest prawdopodobnie:
vector<char> v(str.begin(), str.end());
char* ca = &v[0]; // pointer to start of vector