Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah `c_str()` dalam C 11 masih dijamin untuk mengembalikan rentetan yang ditamatkan nol?

Adakah `c_str()` dalam C 11 masih dijamin untuk mengembalikan rentetan yang ditamatkan nol?

Barbara Streisand
Barbara Streisandasal
2024-10-28 09:22:02256semak imbas

Is `c_str()` in C  11 still guaranteed to return a null-terminated string?

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!

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