2011-01-21 40 views
23

Cách tốt nhất để chuyển đổi chuỗi kiểu C thành C++ std::string là gì? Trong quá khứ tôi đã thực hiện nó bằng cách sử dụng stringstream s. Có cách nào tốt hơn?Chuyển đổi chuỗi C thành kiểu C++ std :: string

+0

Chuỗi cstring là gì? Bạn có nghĩa là một 'CString' từ MFC? Hoặc một mảng null kết thúc của char (một chuỗi C)? Hay cái gì khác? –

Trả lời

41

C chuỗi ++ có một constructor cho phép bạn chuyển đổi chuỗi C-style:

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

và bây giờ tôi cũng phải làm 'xóa myStr; 'không? –

+0

@BarnabasSzabolcs Không, điều đó không cần thiết. Bạn chỉ cần xóa bộ nhớ được cấp mới. Các con trỏ tới các chuỗi ký tự không cần phải được deallocated. – templatetypedef

+0

Tôi hiểu, vì vậy tôi đoán đúng, chuỗi tạo một bản sao nội bộ của char * này. –

3

Bạn có thể khởi một std::string trực tiếp từ một c-string:

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

Kiểm tra các nhà thầu khác nhau của chuỗi lớp: documentation Bạn có thể quan tâm đến:

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

Và:

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

Nếu bạn có ý nghĩa char*-std::string, bạn có thể sử dụng các nhà xây dựng.

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

Hoặc nếu string s đã tồn tại, bạn chỉ cần viết này:

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

No. Ví dụ của bạn sẽ ném một lỗi logic trong std :: constructor của chuỗi. 'a' không thể là NULL. –

1

Nói chung (không có tuyên bố lưu trữ mới), bạn chỉ có thể sử dụng các nhà xây dựng 1-arg để thay đổi c-chuỗi thành một chuỗi rvalue:

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

Tuy nhiên, điều này không làm việc khi xây dựng chuỗi để vượt qua nó bằng cách tham chiếu đến một chức năng (một vấn đề tôi chỉ chạy vào), ví dụ:

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

Bạn cần phải thực hiện các tài liệu tham khảo một tham chiếu const:

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

C++11: quá tải một nhà điều hành literal chuỗi

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: Sử dụng các nhà điều hành từ std::string_literals namespace

using namespace std::string_literals; 

auto s3 = "abc\0\0def"s; // is a std::string 
Các vấn đề liên quan