Comment convertir char* tableau dans std::string
J'ai déclaré un char * tableau char *excluded_string[50] = { 0 };
Plus tard, chaque élément de excluded_string
tableau devient un mot. Maintenant, je veux le convertir en chaîne de caractères afin que je puisse avoir tous les mots séparés par un espace.
std::string ss(excluded_string);
donne une erreur:
serveur.rpc:171:32: error: no matching function for call to ‘std::basic_string::basic_string(char* [50]) " et de grandes délicat explication!
- Je ne suis pas conformes avec le c++, mais ne devrait pas être iit un char Tableau de chaîne de caractères? sinon, vous avez eu à déréférencer chaque char dans une boucle ou une sorte de avant de les ajouter à la chaîne, wouldnt vous ahve pour?!
- il a un tableau de char *, qui est essentiellement un tableau de chaînes de caractères
- Ouais, donc si vous voulez le convertir en gardant le traitement, il doit le convertir en un std::string * comme si c'est possible, wouldnt-il?
- std::string peut être construit à partir d'un char*, donc M M. la solution de la tour où le char * est implicitement construit dans un std::string et ajouté à un seul std::string
- Jetez un oeil à http://stackoverflow.com/questions/1833447/a-good-example-for-boostalgorithmjoin si vous pouvez utiliser boost.
Vous devez vous connecter pour publier un commentaire.
À la convertir en une chaîne unique:
Edit: quelques remarques:
si possible, ne pas concaténer des chaînes de caractères directement: qui permettra de créer et de détruire un tas d'objets et effectuer beaucoup d'inutiles allocations.
si votre code a de strictes exigences en matière d'efficacité, envisager d'allouer/réservant le résultat à l'avance pour s'assurer une allocation unique au lieu de la répétition des allocations.
si vous concaténer des chaînes, envisagez d'utiliser l'opérateur += au lieu de + et =.
Edit 2: (répondre aux commentaires)
Voici la résolution des deux alternatives pour la concaténation de chaînes (s += s1 + s2 vs s += s1; s += s2):
code:
Code équivalent (en termes d'objets construits et les allocations):
À la fois temporaires créer une copie des données (allouer de la mémoire tampon, de copier des données, désallouer de la mémoire tampon).
code:
std::string::operator += est appelée deux fois; Il alloue de l'espace (si nécessaire), des copies contenu actuel de la chaîne nouvellement alloué l'espace, puis les copies de nouvelles données à la fin de la mémoire tampon allouée.
unique pré-alloué de l'espace:
allocation/réservant le résultat à l'avance pour s'assurer une allocation unique
Dans ce cas, l'opérateur+= ne pas allouer de l'espace à l'interne, juste au début (une seule opération). C'est encore un peu lent, parce que vous itérer sur les cordes deux fois (0->49) et sur chaque chaîne deux fois (une fois pour calculer une longueur, une fois de le copier à ss).
Si votre excluded_string ont été un std::vector au lieu de cela, il serait plus efficace, car le calcul de chaînes de longueurs ne serait pas parcourir chaque chaîne, juste le vecteur).
Solution Possible
Depuis que vous avez pris soin d'initialiser votre tableau de pointeurs vers c_str à 0, nous pouvons utiliser ces connaissances pour seulement ajouter effectivement alloués mots :
Aussi, vous devez d'abord construire une std::string basé sur l'original c_str avant de pouvoir utiliser la concaténation
operator+
.De détails sur l'erreur d'origine
Le type de votre
excluded_string
objet est un tableau statique de 50 pointeurs de char. Tous les pointeurs de char étant initialisé à 0 par votre code.Un pointeur vers char peut être mentionné comme un chaîne C, ou de façon plus concise, c_str.
C++ STL vous donne la
std::string
classe, pour qui plusieurs constructeurs sont définis. L'un d'eux tenant un c_str (c'est à dire un pointeur vers char) pour initialiser la chaîne (manière affectée, la convertissant en un pointeur const char, qui est une conversion implicite dans cette expression).Ce constructeur est celui que nous utilisons dans la solution lorsque nous écrire:
Mais comme vous pouvez le voir, il n'y a pas de constructeur prenant un tableau de c_str, ce qui est exactement ce que vous erreur du compilateur de vous indique.
MODIFIER : Libellé, grâce à Légèreté Courses en Orbite commentaire. (cast sens en fait conversion explicite).
std::string
, pas un nom à une chaîne CEssayer une boucle:
Vous êtes le code dans la meilleure situation va mettre de la première chaîne de
ss
.