Come convertire un array di caratteri in una stringa?


254

La conversione di un C ++ stringin un array di caratteri è piuttosto semplice usando la c_strfunzione di stringa e poi facendo strcpy. Tuttavia, come fare il contrario?

Ho un array di caratteri, come: char arr[ ] = "This is a test";di essere di nuovo convertito: string str = "This is a test.

Risposte:


369

La stringclasse ha un costruttore che accetta una stringa C terminata con 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;

2
Funzionerebbe comunque in entrambi i modi. L'operatore di assegnazione sovraccarico prende a const char*, quindi puoi passargli una stringa letterale o un array di caratteri (che decade a quello).
Mistico il

3
@ kingsmasher1: a rigor di termini, le stringhe nella forma "hello world" sono array. Se lo usi sizeof("hello world")ti darà la dimensione dell'array (che è 12), piuttosto che la dimensione di un puntatore (probabilmente 4 o 8).
Dreamlax,

7
Si noti che questo funziona solo per stringhe C costanti con terminazione NULL. Il stringcostruttore non funzionerà, ad esempio, con una stringa di argomento passata dichiarata come unsigned char * buffer, qualcosa di molto comune nelle librerie di gestione del flusso di byte.
CXJ,

4
Non è necessario che nulla sia costante. Se hai un buffer di byte di qualsiasi tipo di carattere, puoi usare l'altro costruttore:, std::string str(buffer, buffer+size);ma probabilmente è meglio attenersi a un std::vector<unsigned char>in quel caso.
R. Martinho Fernandes,

2
Anche se potrebbe essere ovvio: nonstr è una funzione di conversione qui. È il nome della variabile stringa. Puoi usare qualsiasi altro nome di variabile (ad es .). La conversione viene effettuata dal costruttore di std :: string chiamato in modo implicito. string foo(arr);
Christopher K.,

55

Un'altra soluzione potrebbe apparire così,

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

che evita di usare una variabile aggiuntiva.


Potresti indicare nella risposta come questo è diverso dalla risposta accettata my Misticial?
Maarten Bodewes,

@owlstead, vedi la modifica. Ho semplicemente messo la mia risposta perché è quello che vorrei aver visto quando mi sono imbattuto per la prima volta in questa pagina in cerca di una risposta. Se qualcuno altrettanto stupido come me si imbatte in questa pagina ma non è in grado di stabilire tale connessione guardando la prima risposta, spero che la mia risposta possa essere di aiuto.
stackPusher

5
Poiché string () è il costruttore di std :: string, vale la pena ricordare che è necessario aggiungere lo spazio dei nomi std nel caso in cui non si stia utilizzando lo spazio dei nomi std. Esempio:cout << "test:" + std::string(arr);
Christopher K.,

1
@ChristopherK. L'ho lasciato fuori perché così ha fatto la risposta più votata. La mia risposta dovrebbe essere un supplemento a quella risposta, quindi ho mantenuto le stesse ipotesi. Spero che chiunque non capisca che vedrà il tuo commento
stackPusher,

Str è un nome variabile o una chiave qui posso usare string aString(someChar);?
Driss Bounouar,

31

C'è un piccolo problema mancante nelle risposte più votate. Vale a dire, l'array di caratteri può contenere 0. Se useremo il costruttore con un singolo parametro come indicato sopra, perderemo alcuni dati. La possibile soluzione è:

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

L'output è:

123
123 123


2
Questa è una risposta migliore se si utilizza std::stringcome contenitore per dati binari e non si può essere certi che l'array non contenga '\ 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;
}

SU:

H : is a char array beginning with 17 chars long

Hello from Chile. :is a string with 17 chars long

Dov'è gratuito (tmp)? la corda se ne occupa?
huseyin tugrul buyukisik,

1
buona domanda. Penso che dovrebbe esserci libero perché sto usando malloc.
Cristian,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.