web-dev-qa-db-fra.com

Conversion d'une chaîne de style C en chaîne C ++ std :: string

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 stringstreams. Y a-t-il une meilleure façon?

32
blcArmadillo

Les chaînes C++ ont un constructeur qui vous permet de construire un std::string directement à partir d'une chaîne de style C:

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

Ou bien:

std::string myCppString = "This is a C string!";

Comme @TrevorHickey le note dans les commentaires, veillez à ce que le pointeur sur lequel vous initialisez le std::string avec n'est pas un pointeur nul. Si c'est le cas, le code ci-dessus conduit à un comportement indéfini. Là encore, si vous avez un pointeur nul, on pourrait dire que vous n'avez même pas de chaîne du tout. :-)

51
templatetypedef

Vérifiez les différents constructeurs de la classe de chaîne: 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);
10
Santiago Alessandri

C++11: surcharge un opérateur littéral de chaîne

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
5
Shreevardhan

Si tu veux dire char* à std::string, vous pouvez utiliser le constructeur.

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

Ou si le string s existe déjà, écrivez simplement ceci:

s=std::string(a);
4
Manas

Vous pouvez initialiser un std::string directement à partir d'une chaîne c:

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

En général (sans déclarer de nouveau stockage), vous pouvez simplement utiliser le constructeur 1-arg pour changer la chaîne c en une valeur de chaîne:

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 pour la transmettre par référence à une fonction (un problème que je viens de rencontrer), par exemple.

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

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

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