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:
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!