Jeg vil konvertere en std::string til en **char* eller char[]** datatype.
std::string str = "string";
char* chr = str;
Resulterer i: "error: cannot convert 'std::string' to 'char' ...".
Hvilke metoder finnes det for å gjøre dette?
Det vil ikke automatisk konvertere (gudskjelov). Du må bruke metoden c_str()
for å få C-strengversjonen.
std::string str = "string";
const char *cstr = str.c_str();
Merk at den returnerer en const char *
; du har ikke lov til å endre C-strengen som returneres av c_str()
. Hvis du vil behandle den, må du kopiere den først:
std::string str = "string";
char *cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());
// do stuff
delete [] cstr;
Eller i moderne C++:
std::vector<char> cstr(str.c_str(), str.c_str() + str.size() + 1);
Hvis du bare vil ha en C-streng som representerer det samme innholdet:
char const* ca = str.c_str();
Hvis du vil ha en C-streng med nytt innhold, er en måte (gitt at du ikke kjenner strengstørrelsen på kompileringstidspunktet) dynamisk allokering:
char* ca = new char[str.size()+1];
std::copy(str.begin(), str.end(), ca);
ca[str.size()] = '\0';
Ikke glem å delete[]
den senere.
Hvis du vil ha et statisk allokert array med begrenset lengde i stedet:
size_t const MAX = 80; // maksimalt antall tegn
char ca[MAX] = {};
std::copy(str.begin(), (str.size() >= MAX ? str.begin() + MAX : str.end()), ca);
std::string
ikke implisitt konvertere til disse typene for den enkle grunn at behovet for å gjøre dette er vanligvis en design lukt. Forsikre deg om at du virkelig trenger det.
Hvis du definitivt trenger en char*
, den beste måten er sannsynligvis:
vector<char> v(str.begin(), str.end());
char* ca = &v[0]; // pointer to start of vector