Ngay cả khi biết rằng bạn đã thấy rằng họ làm như vậy, hoặc .data () gọi .c_str (), sẽ không đúng khi cho rằng điều này sẽ xảy ra với các 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 thức .c_str () khi bạn đang sử dụng chuỗi của mình như ví dụ 1.
Bạn nên sử dụng phương thức .data () khi bạn đang sử dụng chuỗi của mình như ví dụ 2. Không phải vì việc sử dụng .c_str () trong những trường hợp này là vô ích, mà vì rõ ràng hơn là bạn đang làm việc với dữ liệu nhị phân để người khác xem xét. ma cua ban.
Cạm bẫy có thể xảy ra khi sử dụng .data ()
Mã sau sai và có thể gây ra lỗi mặc định 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 những người triển khai thường làm cho .data () và .c_str () làm điều tương tự?
Vì làm như vậy sẽ hiệu quả hơn. Cách duy nhất để làm cho .data () trả về một cái gì đó không bị kết thúc bằng null, 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 kết thúc null duy nhất luôn có nghĩa là bạn luôn có thể chỉ sử dụng một bộ đệm bên trong khi triển khai std :: string.
.data()
, vì vậy chúng không còn tương đương với các chuỗi không phải là hằng số.