Rumah >pembangunan bahagian belakang >C++ >Adakah `rentetan::c_str()` C 11 Masih Menjamin Rentetan Ditamatkan Null?

Adakah `rentetan::c_str()` C 11 Masih Menjamin Rentetan Ditamatkan Null?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-27 15:35:02433semak imbas

 Does C  11's `string::c_str()` Still Guarantee a Null-Terminated String?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn