c_str() dan Null-Terminated Strings dalam C 11
Dalam C 11, takrifan basic_string::c_str() menimbulkan soalan: adakah ia masih menghasilkan rentetan yang ditamatkan nol?
Isunya
Dalam C 11, basic_string::c_str ditakrifkan untuk menjajarkan dengan basic_string::data, yang seterusnya menjajarkan dengan (begin() n) dan (&*begin() n). Tiada keperluan eksplisit untuk aksara nol pada penghujung rentetan.
Jawapannya
Walaupun kekurangan definisi yang jelas, rentetan dalam C 11 diperlukan untuk gunakan penimbal yang ditamatkan nol secara dalaman. Ini jelas dalam takrif operator[]:
"Pulangan: *(mulakan() pos) jika pos < saiz(), jika tidak, rujukan kepada objek jenis T dengan nilai carta(); nilai yang dirujuk tidak boleh diubah suai."
Memandangkan c_str ditakrifkan dari segi operator[] dan kedua-dua c_str dan data mestilah O(1), pelaksanaan terpaksa menggunakan penimbal yang ditamatkan nol.
Pertimbangan Tambahan
Keperluan nilai pulangan untuk operator[] membayangkan bahawa anda boleh menggunakan &operator[](0) untuk mendapatkan c_str(). Ini bermakna aksara null yang ditamatkan mesti berada dalam penimbal yang sama. Akibatnya, walaupun penamat dimulakan dengan malas, ia tidak boleh diperhatikan dalam keadaan pertengahan.
Kesimpulan
Bertentangan dengan andaian awal, c_str() dalam C 11 ialah masih dijamin menghasilkan rentetan yang ditamatkan nol, memastikan keserasian dengan kod lama dan membolehkan akses aksara yang cekap.
Atas ialah kandungan terperinci Adakah `c_str()` dalam C 11 masih dijamin untuk mengembalikan rentetan yang ditamatkan nol?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!