std :: ssortingng à char *

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

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

Résultats: «error: impossible de convertir ‘std :: ssortingng’ en ‘char’ …» .

Quelles sont les méthodes disponibles pour cela?

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::ssortingng str = "ssortingng"; const char *cstr = str.c_str(); 

Notez qu’il retourne 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 devez d’abord le copier:

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

Ou en C ++ moderne:

 std::vector cstr(str.c_str(), str.c_str() + str.size() + 1); 

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

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

Si j’avais besoin d’une copie brute modifiable du contenu d’une chaîne c ++, alors je le ferais:

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

et ensuite:

 free(chr); 

Alors pourquoi ne pas me tromper avec std :: vector ou new [] comme n’importe qui d’autre? Parce que quand j’ai besoin d’une chaine char * brute C-style mutable, alors parce que je veux appeler le code C qui change la chaîne et le code C, deallocates stuff avec free () et alloue avec malloc () (strdup utilise malloc) . Donc, si je transmets ma chaîne brute à une fonction X écrite en C, il pourrait avoir une contrainte sur son argument qu’il doit allouer sur le tas (par exemple si la fonction peut appeler realloc sur le paramètre). Mais il est hautement improbable qu’il s’attende à un argument alloué avec (certains redéfinis par les utilisateurs) new []!

(Cette réponse s’applique uniquement à C ++ 98).

S’il vous plaît, n’utilisez pas un caractère brut char* .

 std::ssortingng str = "ssortingng"; std::vector chars(str.c_str(), str.c_str() + str.size() + 1u); // use &chars[0] as a char* 
  • Si vous voulez juste une chaîne de style C représentant le même contenu:

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

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

    N’oubliez pas de le delete[] plus tard.

  • Si vous voulez un tableau à longueur limitée alloué de manière statique:

     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::ssortingng ne convertit pas implicitement ces types pour la simple raison que cela nécessite généralement une odeur de conception. Assurez-vous que vous en avez vraiment besoin.

Si vous avez absolument besoin d’un char* , le meilleur moyen est probablement:

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

Ce serait préférable en tant que commentaire sur la réponse de Bobobobo, mais je n’ai pas de représentant pour cela. Il accomplit la même chose mais avec de meilleures pratiques.

Bien que les autres réponses soient utiles, si vous devez convertir std::ssortingng en char* explicitement sans const, const_cast est votre ami.

 std::ssortingng str = "ssortingng"; char* chr = const_cast(str.c_str()); 

Notez que cela ne vous donnera pas une copie des données; cela vous donnera un pointeur sur la chaîne. Ainsi, si vous modifiez un élément de chr , vous modifierez str .

En supposant que vous ayez juste besoin d’une chaîne de style C pour passer en entrée:

 std::ssortingng str = "ssortingng"; const char* chr = str.c_str(); 

Pour être ssortingctement pédant, vous ne pouvez pas “convertir un std :: ssortingng en un type de données char * ou char [].”

Comme les autres réponses l’ont montré, vous pouvez copier le contenu de std :: ssortingng dans un tableau de caractères ou créer un const char * dans le contenu de la chaîne std :: ssortingng pour pouvoir y accéder dans un “style C”. .

Si vous essayez de modifier le contenu de std :: ssortingng, le type std :: ssortingng a toutes les méthodes pour faire tout ce que vous pourriez avoir besoin de lui faire.

Si vous essayez de le passer à une fonction qui prend un caractère *, il y a std :: ssortingng :: c_str ().

Pour être complet, n’oubliez pas std::ssortingng::copy() .

 std::ssortingng str = "ssortingng"; const size_t MAX = 80; char chrs[MAX]; str.copy(chrs, MAX); 

std::ssortingng::copy() ne termine pas NUL. Si vous devez vous assurer d’un terminateur NUL à utiliser dans les fonctions de chaîne C:

 std::ssortingng str = "ssortingng"; const size_t MAX = 80; char chrs[MAX]; memset(chrs, '\0', MAX); str.copy(chrs, MAX-1); 

Voici une version plus robuste de Protocol Buffer

 char* ssortingng_as_array(ssortingng* str) { return str->empty() ? NULL : &*str->begin(); } // test codes std::ssortingng mystr("you are here"); char* pstr = ssortingng_as_array(&mystr); cout << pstr << endl; // you are here 
 char* result = strcpy((char*)malloc(str.length()+1), str.c_str()); 

Vous pouvez également utiliser des vecteurs pour obtenir un caractère inscriptible *, comme indiqué ci-dessous.

 //this handles memory manipulations and is more convenient ssortingng str; vector  writable (str.begin (), str.end) ; writable .push_back ('\0'); char* cssortingng = &writable[0] //or &*writable.begin () //Goodluck 

Vous pouvez le faire en utilisant un iterator.

 std::ssortingng str = "ssortingng"; std::ssortingng::iterator p=str.begin(); char* chr = &(*p); 

Bonne chance.

Cela fonctionnera aussi

 std::ssortingng s; std::cout<<"Enter the String"; std::getline(std::cin, s); char *a=new char[s.size()+1]; a[s.size()]=0; memcpy(a,s.c_str(),s.size()); std::cout< 

Une version sécurisée de char * orlp répond en utilisant unique_ptr:

 std::ssortingng str = "ssortingng"; auto cstr = std::make_unique(str.length() + 1); strcpy(cstr.get(), str.c_str());