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

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

Susan Sarandon
Lepaskan: 2024-10-27 00:52:02
asal
393 orang telah melayarinya

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan