Comment convertir un tableau de caractères en chaîne?

254

Convertir un C ++ stringen un tableau de caractères est assez simple en utilisant la c_strfonction de chaîne, puis en faisant strcpy. Mais comment faire le contraire?

J'ai un tableau de caractères comme: char arr[ ] = "This is a test";être convertie à: string str = "This is a test.

kingsmasher1
la source

Réponses:

369

La stringclasse a un constructeur qui prend une chaîne C terminée par NULL:

char arr[ ] = "This is a test";

string str(arr);


//  You can also assign directly to a string.
str = "This is another string";

// or
str = arr;
Mysticial
la source
2
Cela fonctionnerait toujours de toute façon. L'opérateur d'affectation surchargé prend un const char*, vous pouvez donc lui passer un littéral de chaîne ou un tableau de caractères (qui se désintègre).
Mysticial
3
@ kingsmasher1: À strictement parler, les chaînes du formulaire "hello world" sont des tableaux. Si vous l'utilisez, vous sizeof("hello world")obtiendrez la taille du tableau (qui est 12), plutôt que la taille d'un pointeur (probablement 4 ou 8).
dreamlax
7
Notez que cela ne fonctionne que pour les chaînes C constantes terminées par NULL. Le stringconstructeur ne fonctionnera pas avec, par exemple, une chaîne d'arguments passée déclarée comme unsigned char * buffer, quelque chose de très courant dans les bibliothèques de gestion de flux d'octets.
CXJ
4
Il n'y a pas besoin que quelque chose soit constant. Si vous avez un tampon d'octets de n'importe quel type de caractère, vous pouvez utiliser l'autre constructeur:, std::string str(buffer, buffer+size);mais il vaut probablement mieux s'en tenir à un std::vector<unsigned char>dans ce cas.
R. Martinho Fernandes
2
Bien que cela puisse être évident: ce strn'est pas une fonction de conversion ici. Il s'agit du nom de la variable chaîne. Vous pouvez utiliser tout autre nom de variable (par exemple string foo(arr);). La conversion est effectuée par le constructeur de std :: string qui est appelé implicitement.
Christopher K.
55

Une autre solution pourrait ressembler à ceci,

char arr[] = "mom";
std::cout << "hi " << std::string(arr);

ce qui évite d'utiliser une variable supplémentaire.

stackPusher
la source
Pourriez-vous indiquer dans la réponse en quoi cela diffère de la réponse acceptée mon Misticial?
Maarten Bodewes du
@owlstead veuillez voir la modification. J'ai simplement mis ma réponse parce que c'est ce que j'aurais aimé voir la première fois que je suis tombé sur cette page à la recherche d'une réponse. Si quelqu'un d'aussi stupide que moi tombe sur cette page mais n'est pas en mesure d'établir ce lien en regardant la première réponse, j'espère que ma réponse l'aidera.
stackPusher
5
Comme string () est le constructeur de std :: string, il peut être utile de mentionner que vous devez ajouter l'espace de noms std au cas où vous n'utilisez pas l'espace de noms std. Exemple:cout << "test:" + std::string(arr);
Christopher K.
1
@ChristopherK. J'ai omis cela parce que la réponse la mieux notée aussi. Ma réponse est censée être un complément à cette réponse, j'ai donc gardé les mêmes hypothèses. J'espère que quiconque ne comprend pas cela verra votre commentaire
stackPusher
Est-ce que str est un nom de variable ou est-ce que je peux utiliser ici une clé string aString(someChar);?
Driss Bounouar
31

Il y a un petit problème manqué dans les réponses les plus votées. À savoir, le tableau de caractères peut contenir 0. Si nous utilisons un constructeur avec un seul paramètre comme indiqué ci-dessus, nous perdrons certaines données. La solution possible est:

cout << string("123\0 123") << endl;
cout << string("123\0 123", 8) << endl;

La sortie est:

123
123 123

Yola
la source
2
C'est une meilleure réponse si vous utilisez std::stringcomme conteneur pour les données binaires et ne pouvez pas être certain que le tableau ne contient pas '\ 0'.
Assil Ksiksi
11
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string>

using namespace std;

int main ()
{
  char *tmp = (char *)malloc(128);
  int n=sprintf(tmp, "Hello from Chile.");

  string tmp_str = tmp;


  cout << *tmp << " : is a char array beginning with " <<n <<" chars long\n" << endl;
  cout << tmp_str << " : is a string with " <<n <<" chars long\n" << endl;

 free(tmp); 
 return 0;
}

EN DEHORS:

H : is a char array beginning with 17 chars long

Hello from Chile. :is a string with 17 chars long
Cristian
la source
Où est gratuit (tmp)? la chaîne s'en occupe-t-elle?
huseyin tugrul buyukisik
1
bonne question. Je pense que la gratuité devrait être là car j'utilise malloc.
Cristian