2011-01-21 6 views
23

Quelle est la meilleure façon de convertir une chaîne de style C en C++ std::string? Dans le passé, je l'ai fait en utilisant stringstream s. Y a-t-il un meilleur moyen?Conversion d'une chaîne de style C en C++ std :: string

+0

Qu'est-ce qu'une chaîne de caractères? Voulez-vous dire un «CString» de MFC? Ou un tableau null-terminé de char (une chaîne C)? Ou autre chose? –

Répondre

41

chaînes C++ ont un constructeur qui vous permet de convertir des chaînes de style C:

char* myStr = "This is a C string!"; 
std::string myCppString = myStr; 
+0

et maintenant je dois aussi supprimer 'myStr;' non? –

+0

@BarnabasSzabolcs Non, ce n'est pas nécessaire. Vous avez seulement besoin de supprimer la mémoire allouée avec new. Les pointeurs vers les littéraux de chaîne n'ont pas besoin d'être désalloués. – templatetypedef

+0

Je vois, donc je devine juste, chaîne fait une copie interne de ce char *. –

3

Vous pouvez initialiser un std::string directement à partir d'un c-string:

std::string s = "i am a c string"; 
std::string t = std::string("i am one too"); 
5

Vérifiez les différents constructeurs de la classe de corde: documentation Vous pourriez être intéressé par:

//string(char* s) 
std::string str(cstring); 

Et:

//string(char* s, size_t n) 
std::string str(cstring, len_str); 
4

Si vous voulez dire char*-std::string, vous pouvez utiliser le constructeur.

char* a; 
std::string s(a); 

Ou si le string s existe déjà, il suffit d'écrire ceci:

s=std::string(a); 
+1

Non. Votre exemple lancerait une erreur de logique dans le constructeur de std :: string. 'a' ne peut pas être NULL. –

1

En général (sans déclarer un nouveau stockage) vous pouvez simplement utiliser le constructeur 1-arg pour changer le c-string en chaîne rvalue:

string xyz = std::string("this is a test") + 
      std::string(" for the next 60 seconds ") + 
      std::string("of the emergency broadcast system."); 

Cependant, cela ne fonctionne pas lors de la construction de la chaîne à passer par référence à une fonction (un problème que je viens de croiser), par exemple

void ProcessString(std::string& username); 
ProcessString(std::string("this is a test")); // fails 

Vous devez faire la référence une référence const:

void ProcessString(const std::string& username); 
ProcessString(std::string("this is a test")); // works. 
3

C++11: surcharger un opérateur de chaîne littérale

std::string operator ""_s(const char * str, std::size_t len) { 
    return std::string(str, len); 
} 

auto s1 = "abc\0\0def";  // C style string 
auto s2 = "abc\0\0def"_s; // C++ style std::string 

C++14: Utilisez l'opérateur de std::string_literals espace de noms

using namespace std::string_literals; 

auto s3 = "abc\0\0def"s; // is a std::string 
Questions connexes