2011-01-21 46 views
23

bir C++ std::string bir C tarzı dize dönüştürmek için en iyi yolu nedir bir C tarzı dize dönüştürme? Geçmişte, stringstream s kullanarak yaptım. Daha iyi bir yolu var mı? Bir c-string doğrudan std::string ilklendirebilirsinizbir C++ std :: string

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

bir cstring nedir? MFC'den bir "CString" mi demek istiyorsun? Ya da boş sonlandırılmış bir dizi char (bir C dizesi)? Veya başka bir şey? –

cevap

41

C++ dizeleri C tarzı dizeleri dönüştürmek sağlayan bir yapıcı dize sınıfı: documentation belki ilgilenen içinde:

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

Ve: Eğer char*std::string demek ise

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

ve şimdi de myStr'i silmek zorundayım; hayır? –

+0

@BarnabasSzabolcs Hayır, bu gerekli değil. Sadece yeni ile ayrılan belleği silmeniz yeterlidir. Dize edicilere işaret eden işaretçiler serbest bırakılmaları gerekmez. – templatetypedef

+0

Anlıyorum, bu yüzden doğru tahmin ediyorum, dize bu char * bir iç kopyasını yapar. –

3

:

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

farklı kurucular kontrol

4

, sen kurucu kullanabilirsiniz.

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

Ya string s zaten varsa, sadece bu bilgileri: Eğer sadece bir içine c-string değiştirmek için 1-arg kurucu kullanabilirsiniz (yeni depolama beyan olmadan) Genelde

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

Hayır. Örneğiniz, std :: string'in yapıcısında bir mantık hatası atacaktır. 'a' NULL olamaz. –

1

dize rvalue: (a sorun sadece koştu), örneğin bir işleve referans olarak geçmek dize oluştururken

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

Ancak bu işe yaramaz

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

C++11: Aşırı yük bir dize operatörü

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: std::string_literals ad alanından operatörünü kullanın

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

Sen referansı bir sabit başvuru yapmak gerekir

using namespace std::string_literals; 

auto s3 = "abc\0\0def"s; // is a std::string 
İlgili konular