Rumah >pembangunan bahagian belakang >C++ >Adakah `rentetan::c_str()` C 11 Masih Menjamin Rentetan Ditamatkan Null?
Adakah rentetan C 11::c_str() Fungsi Tidak Lagi Ditamatkan Null?
Dalam C , kelas basic_string menyediakan pelbagai kaedah untuk mengakses watak-wataknya. Salah satu kaedah ini, c_str(), telah menjadi punca kekeliruan sejak C 11. Sebelum C 11, c_str() bertanggungjawab untuk mengembalikan tatasusunan aksara yang ditamatkan nol yang mewakili kandungan rentetan.
Walau bagaimanapun, dalam C 11, takrifan basic_string::c_str() telah berubah. Ia kini ditakrifkan sebagai sama seperti basic_string::data, yang seterusnya mengembalikan penunjuk ke permulaan penimbal aksara dalaman rentetan. Ini menimbulkan persoalan: adakah perubahan ini membayangkan bahawa c_str() tidak lagi menjamin rentetan yang ditamatkan nol?
Jawapannya: Rentetan Memerlukan Penampan Ditamatkan Null Secara Dalaman
Jawapan kepada soalan ini adalah tidak. Walaupun terdapat perubahan dalam C 11, rentetan masih diperlukan untuk menggunakan penimbal yang ditamatkan nol secara dalaman. Ini terbukti daripada takrifan kaedah operator[] (21.4.5) dalam standard C:
Requires: pos <= size(). Returns: *(begin()+pos) if pos < size(), otherwise a reference to an object of type T with value charT(); the referenced value shall not be modified.
c_str() ditakrifkan dari segi operator[]:
Returns: A pointer p such that p + i == &operator[](i) for each i in [0,size()].
Memandangkan c_str() dan data kedua-duanya diperlukan untuk operasi O(1), pelaksanaan secara berkesan terpaksa menggunakan penimbal yang ditamatkan nol. Selain itu, keperluan nilai pulangan untuk operator[] memastikan bahawa c_str() mengembalikan penunjuk kepada penimbal yang ditamatkan nol. Oleh itu, c_str() terus menyediakan rentetan yang ditamatkan nol, walaupun terdapat perubahan dalam C 11.
Atas ialah kandungan terperinci Adakah `rentetan::c_str()` C 11 Masih Menjamin Rentetan Ditamatkan Null?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!