Meskipun Anda telah melihat bahwa mereka melakukan hal yang sama, atau bahwa .data () memanggil .c_str (), tidaklah benar untuk mengasumsikan bahwa ini akan menjadi kasus untuk kompiler lain. Mungkin juga kompilator Anda akan berubah dengan rilis mendatang.
2 alasan untuk menggunakan std :: string:
std :: string dapat digunakan untuk teks dan data biner arbitrer.
//Example 1
//Plain text:
std::string s1;
s1 = "abc";
//Example 2
//Arbitrary binary data:
std::string s2;
s2.append("a\0b\0b\0", 6);
Anda harus menggunakan metode .c_str () saat Anda menggunakan string Anda sebagai contoh 1.
Anda harus menggunakan metode .data () saat Anda menggunakan string sebagai contoh 2. Bukan karena berbahaya untuk menggunakan .c_str () dalam kasus ini, tetapi karena lebih eksplisit bahwa Anda bekerja dengan data biner untuk ditinjau orang lain kode Anda.
Kemungkinan jebakan dengan menggunakan .data ()
Kode berikut salah dan dapat menyebabkan segfault dalam program Anda:
std::string s;
s = "abc";
char sz[512];
strcpy(sz, s.data());//This could crash depending on the implementation of .data()
Mengapa umum bagi pelaksana untuk membuat .data () dan .c_str () melakukan hal yang sama?
Karena lebih efisien melakukannya. Satu-satunya cara untuk membuat .data () mengembalikan sesuatu yang tidak diakhiri null, adalah dengan membuat .c_str () atau .data () menyalin buffer internalnya, atau hanya menggunakan 2 buffer. Memiliki satu buffer diakhiri null selalu berarti bahwa Anda selalu dapat menggunakan hanya satu buffer internal saat mengimplementasikan std :: string.
.data()
, sehingga tidak lagi setara untuk string non-konstan.