Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah `string::c_str()` C 11 Masih Ditamatkan?

Adakah `string::c_str()` C 11 Masih Ditamatkan?

Susan Sarandon
Susan Sarandonasal
2024-10-27 00:52:02320semak imbas

Is C  11's `string::c_str()` Still Null-Terminated?

Adakah rentetan C 11::c_str() Menghapuskan Penamatan Null?

Dalam C 11, string::c_str tidak lagi dijamin untuk menghasilkan rentetan yang ditamatkan nol.

Sebab:

Dalam C 11, string::c_str ditakrifkan sebagai sama dengan rentetan::data, yang seterusnya ditakrifkan sebagai bersamaan dengan *(begin() n) untuk 0 <= n < saiz(). Standard tidak secara eksplisit memerlukan rentetan untuk mempunyai aksara nol pada penghujungnya.

Akibat:

Ini membayangkan bahawa rentetan::c_str() mungkin tidak kembali rentetan yang ditamatkan nol, yang membawa kepada kemungkinan ralat dalam senario yang menganggap penamatan sedemikian.

Penyelesaian:

Penyelesaian adalah menggunakan rentetan::c_str() hanya untuk keserasian dengan kod warisan. Untuk kod baharu, gunakan string::data() sebaliknya. Walaupun string::data() tidak mengembalikan rentetan yang ditamatkan nol, ia mengembalikan penuding kepada penimbal asas, yang dijamin akan ditamatkan secara dalaman.

Butiran Pelaksanaan:

Secara dalaman, rentetan kini diperlukan untuk menggunakan penimbal yang ditamatkan nol. Takrif operator[] dalam bahagian 21.4.5 menghendaki bahawa untuk saiz() <= pos, operator mengembalikan rujukan kepada carta() dengan nilai ' ', dengan berkesan menguatkuasakan penimbal yang ditamatkan nol.

Nota Tambahan:

  • &operator[](0) boleh digunakan sebagai sinonim untuk c_str().
  • Aksara nol penamat mesti terletak pada yang sama penimbal sebagai data rentetan, kerana *(saiz p()) mestilah sama dengan carta(). Oleh itu, walaupun aksara nol dimulakan dengan malas, penimbal tidak boleh dilihat dalam keadaan pertengahan.

Atas ialah kandungan terperinci Adakah `string::c_str()` C 11 Masih Ditamatkan?. 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