std::string to char*

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?

Løsning

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 cstr(str.c_str(), str.c_str() + str.size() + 1);
Kommentarer (18)
  • 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 v(str.begin(), str.end());
char* ca = &v[0]; // pointer to start of vector
Kommentarer (15)

Forutsatt at du bare trenger en C-streng som input:

std::string str = "string";
const char* chr = str.c_str();
Kommentarer (0)