String rentetan, rentetan dan char* Kekeliruan Penukaran
Artikel ini menangani isu menugaskan const char* kepada rentetan yang dikembalikan oleh stringstream .str().c_str().
Penjelasan Masalah
stringstream.str() membina objek rentetan sementara yang dimusnahkan pada penghujung ungkapan. Apabila menetapkan rentetan sementara ini kepada const char*, penuding merujuk rentetan yang dipadamkan, menghasilkan output sampah.
Berikut ialah contoh:
stringstream ss("this is a string\n"); const char* cstr = ss.str().c_str();
Dalam kod di atas, selepas ungkapan berakhir, rentetan sementara yang dibuat oleh stringstream.str() dipadamkan, menyebabkan cstr menghala ke lokasi memori yang tidak sah.
Penyelesaian
Untuk membetulkan isu ini, rentetan sementara hendaklah disalin ke objek rentetan lain sebelum menukarnya kepada const char*. Ini boleh dicapai menggunakan pendekatan berikut:
string tmp = stringstream.str(); const char* cstr = tmp.c_str();
Penjelasan Mata Bonus
Kod yang diubah suai berikut mencetak rentetan dengan betul:
cout << cstr << ss.str().c_str() << cstr2;
Pengubahsuaian ini berfungsi kerana:
Atas ialah kandungan terperinci Mengapa Menetapkan `stringstream.str().c_str()` kepada `const char*` Membawa kepada Output Sampah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!