399 votes

std :: string à char *

Je veux convertir un std :: string en un type de données char * ou char [] .

 std::string str = "string";
char* chr = str;
 

Results in: "error: impossible de convertir 'std :: string' en 'char' ..." .

Quelles sont les méthodes disponibles pour cela?

760voto

nightcracker Points 34498

Il ne convertira pas automatiquement (merci mon Dieu). Vous devrez utiliser la méthode c_str() pour obtenir la version de la chaîne C.

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

Notez qu'il renvoie un const char * ; vous n'êtes pas autorisé à modifier la chaîne de style C renvoyée par c_str() . Si vous voulez le traiter, vous devrez d'abord le copier:

 std::string str = "string";
char *cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());
// do stuff
delete [] cstr;
 

188voto

bobobobo Points 17477

Plus de détails ici , et ici mais vous pouvez utiliser

 string str = "some string" ;
char *cstr = &str[0];
 

43voto

Nordic Mainframe Points 13717

Si j'avais besoin d'une mutable raw copie d'un c++string contenu, alors je le ferais:

std::string str = "string";
char* chr = strdup(str.c_str());

et plus tard:

free(chr); 

Alors pourquoi ne pas jouer avec des std::vector ou [nouveau] comme tout le monde? Parce que quand j'ai besoin d'une mutable C-style brut char* string, puis parce que je veux l'appeler du code C qui permet de modifier la chaîne et le code C libère des choses avec free() et alloue avec malloc() (strdup utilise malloc). Donc, si je passe ma chaîne brute à une fonction X écrit en C , il pourrait avoir une contrainte sur c'est l'argument qu'il a alloué sur le tas (par exemple si la fonction voudrez peut-être appeler le realloc sur le paramètre). Mais il est très peu probable qu'il attend un argument alloué avec (certains l'utilisateur redéfini) [nouveau]!

24voto

ildjarn Points 38377

S'il vous plaît, n'utilisez pas un char* brut.

 std::string str = "string";
std::vector<char> chars(str.c_str(), str.c_str() + str.size() + 1u);
// use &chars[0] as a char*
 

16voto

  • Si vous voulez juste un style C chaîne de caractères représentant le même contenu:

    char const* ca = str.c_str();
    
  • Si vous voulez un style C chaîne de nouveau contenu, un sens (étant donné que vous ne connaissez pas la taille de la chaîne au moment de la compilation) est l'allocation dynamique:

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

    N'oubliez pas d' delete[] plus tard.

  • Si vous voulez une manière statique alloué, limitée à la longueur de la matrice de la place:

    size_t const MAX = 80; // maximum number of chars
    char ca[MAX] = {};
    std::copy(str.begin(), (str.size() >= MAX ? str.begin() + MAX : str.end()), ca);
    

std::string ne pas convertir implicitement à ces types pour la simple raison que le besoin de le faire est généralement une conception de l'odorat. Assurez-vous que vous avez vraiment besoin.

Si vous avez certainement besoin d'un char*, la meilleure façon est probablement:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X