Ngay cả biết bạn đã thấy rằng họ làm như vậy, hoặc là .data() gọi .c_str(), nó không phải là chính xác khi cho rằng đây sẽ là trường hợp cho trình biên dịch khác. Cũng có thể trình biên dịch của bạn sẽ thay đổi với bản phát hành trong tương lai.
2 lý do để sử dụng std :: string:
std :: string có thể được sử dụng cho cả văn bản và dữ liệu nhị phân tùy ý.
//Example 1
//Plain text:
std::string s1;
s1 = "abc";
//Example 2
//Arbitrary binary data:
std::string s2;
s2.append("a\0b\0b\0", 6);
Bạn nên sử dụng phương pháp .c_str() khi bạn đang sử dụng chuỗi của bạn như ví dụ 1.
Bạn nên sử dụng phương pháp .data() khi bạn đang sử dụng chuỗi của bạn làm ví dụ 2. Không bởi vì nó rất nguy hiểm khi sử dụng .c_str() trong những trường hợp này, nhưng vì rõ ràng hơn là bạn đang làm việc với dữ liệu nhị phân để những người khác xem xét mã của bạn.
cạm bẫy có thể xảy ra với việc sử dụng .data()
Các mã sau đây là sai và có thể gây ra một segfault trong chương trình của bạn:
std::string s;
s = "abc";
char sz[512];
strcpy(sz, s.data());//This could crash depending on the implementation of .data()
Tại sao nó phổ biến đối với người thực hiện để làm cho .data() và .c_str() làm điều tương tự?
Bởi vì nó là hiệu quả hơn để làm như vậy. Cách duy nhất để làm cho .data() trả về một cái gì đó mà không phải là null chấm dứt, sẽ là có .c_str() hoặc .data() sao chép bộ đệm bên trong của chúng, hoặc chỉ sử dụng 2 bộ đệm. Có một bộ đệm null kết thúc duy nhất luôn luôn có nghĩa là bạn luôn có thể sử dụng chỉ một bộ đệm nội bộ khi thực hiện std :: string.
Nguồn
2008-10-11 21:12:22
Thực ra, điểm của .data() là không được sao chép bộ đệm trong. Điều này có nghĩa là việc thực hiện không phải lãng phí một char trên \ 0 cho đến khi cần thiết. Bạn sẽ không bao giờ muốn hai bộ đệm: nếu bạn gọi hàm .c_str(), hãy thêm \ 0 vào bộ đệm. .data() vẫn có thể trả về bộ đệm đó. – MSalters
Đồng ý hoàn toàn nó sẽ là vô lý để sử dụng 2 bộ đệm. Làm thế nào để bạn biết đó là lý do tại sao .data được dự định? –
@ BrianR.Bondy Tôi đã thử mã này: ..auto str = string {"Test \ 0String!" }; cout << "DỮ LIỆU:" << str.data() << endl; Đầu ra là "Kiểm tra" chứ không phải toàn bộ chuỗi, Tôi đã làm gì sai? – programmer