std::string til char*

Jeg ønsker at 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 er der til rådighed til at gøre dette?

Løsning

Den konverteres ikke automatisk (gudskelov). Du skal bruge metoden c_str() for at få C-strengversionen.

std::string str = "string";
const char *cstr = str.c_str();

Bemærk, at den returnerer en const char *; du må ikke ændre den C-streng, som returneres af c_str(). Hvis du vil behandle den, skal du først kopiere den:

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 blot ønsker en C-lignende streng, der repræsenterer det samme indhold:

      char const* ca = str.c_str();
  • Hvis du vil have en C-lignende streng med nyt indhold, er en måde (eftersom du ikke kender strengen størrelse på kompileringstidspunktet) dynamisk allokering:

      str.size()+1];
      std::copy(str.begin(), str.end(), ca);
      ca[str.size()] = '\0';

    Glem ikke at delete[] den senere.

  • Hvis du i stedet ønsker et statisk allokeret array af begrænset længde:

      size_t const MAX = 80; // maksimalt antal karaktere
      char ca[MAX] = {};
      std::copy(str.begin(), (str.size() >= MAX ? str.begin() + MAX : str.end())), ca);

std::string konverterer ikke implicit til disse typer af den simple grund, at det normalt er en designlugt at skulle gøre dette. Sørg for, at du virkelig har brug for det.

Hvis du afgjort har brug for en char*, er den bedste måde nok:

vector v(str.begin(), str.end());
char* ca = &v[0]; // pointer to start of vector
Kommentarer (15)

Hvis du antager, at du blot har brug for en C-lignende streng til at sende som input:

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