Memahami Penukaran Stringstream, String dan char*
Satu kekeliruan biasa dalam pengaturcaraan melibatkan interaksi antara aliran rentetan, rentetan dan char penukaran. Artikel ini bertujuan untuk menjelaskan tempat rentetan dikembalikan daripada stringstream.str().c_str() berada dalam ingatan dan mengapa ia tidak boleh diberikan terus kepada const char.
Apabila menggunakan stringstream, str( ) fungsi mengembalikan objek rentetan sementara yang wujud hanya dalam ungkapan di mana ia dipanggil. Objek rentetan ini biasanya dibuat pada tindanan dan dimusnahkan sebaik sahaja ungkapan tamat.
Mari kita periksa contoh kod yang disediakan:
#include <string> #include <sstream> #include <iostream> using namespace std; int main() { stringstream ss("this is a string\n"); string str(ss.str()); const char* cstr1 = str.c_str(); const char* cstr2 = ss.str().c_str(); cout << cstr1 // Prints correctly << cstr2; // ERROR, prints out garbage system("PAUSE"); return 0; }
Isu timbul apabila kita cuba memberikan hasil daripada stringstream.str().c_str() kepada const char* cstr2. Memandangkan rentetan yang dikembalikan adalah sementara, ia dimusnahkan selepas ungkapan tamat, menjadikan cstr2 menunjuk ke penunjuk berjuntai. Akibatnya, pencetakan cstr2 menghasilkan sampah.
Menyelesaikan isu:
Untuk mengelakkan isu ini, kita boleh sama ada menyalin rentetan sementara ke objek rentetan kekal dan mendapatkannya Rentetan gaya C atau ikat rentetan sementara pada rujukan const, memanjangkan hayatnya:
// Copy to a permanent string const std::string tmp = stringstream.str(); const char* cstr = tmp.c_str(); // Bind to a const reference { const std::string& tmp = stringstream.str(); const char* cstr = tmp.c_str(); }
Dalam contoh kod yang diubah suai, kedua-dua cstr dan cstr2 menunjuk kepada rentetan gaya C yang sah yang wujud untuk sepanjang hayat objek rentetan const. Akibatnya, kedua-dua rentetan boleh dicetak dengan betul.
Adalah penting untuk ambil perhatian bahawa mengikat rentetan sementara kepada rujukan const biasanya lebih disukai kerana ia mengelakkan penyalinan yang tidak perlu dan membolehkan penyelesaian yang lebih cekap dan ringkas.
Atas ialah kandungan terperinci Mengapakah memberikan `stringstream.str().c_str()` kepada `const char*` membawa kepada penuding berjuntai-juntai dan bagaimanakah isu ini boleh diselesaikan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!