Cara mengkonversi std::string untuk const char* atau char*?
Bagaimana saya bisa mengkonversi sebuah std::string
ke char*
atau const char*
?
861
8
Bagaimana saya bisa mengkonversi sebuah std::string
ke char*
atau const char*
?
Jika anda hanya ingin lulus
std::string
untuk fungsi yang membutuhkanconst char*
anda dapat menggunakanJika anda ingin mendapatkan ditulisi, seperti
char *
, anda bisa melakukan itu dengan ini:Edit: Perhatikan bahwa di atas tidak terkecuali aman. Jika apa-apa antara
baru
dandelete
call melempar, anda akan kebocoran memori, karena tidak ada yang akan memanggilhapus
untuk anda secara otomatis. Ada dua cara-cara langsung untuk memecahkan masalah ini.meningkatkan::scoped_array
boost::scoped_array
akan menghapus memori anda pada saat akan keluar dari ruang lingkup:std::vektor
Ini adalah cara standar (tidak memerlukan library eksternal). Anda gunakan
std::vektor
, yang benar-benar mengelola memori untuk anda.Mengingat mengatakan...
Mendapatkan `char *` atau `const char*` dari `string`
**Cara mendapatkan karakter pointer yang's berlaku sementara `x` tetap dalam lingkup dan isn't dimodifikasi lebih lanjut** **C++11** menyederhanakan hal-hal, berikut semua memberikan akses yang sama pada internal buffer string:Semua petunjuk di atas akan terus sama nilai - alamat dari karakter pertama dalam buffer. Bahkan string kosong memiliki "karakter pertama dalam buffer", karena C++11 jaminan untuk selalu menjaga ekstra NUL/0 terminator karakter setelah ditetapkan secara tegas string konten (misalnya
std::string("\0that", 9)
akan memiliki penyangga memegang"\0that\0"
). Mengingat semua petunjuk di atas:Gunakan
.c_str()
metodeconst char *
.Anda dapat menggunakan
&mystring[0]
untuk mendapatkanchar *
pointer, tetapi ada beberapa gotcha's: anda tidak't selalu mendapatkan nol string berakhir, dan anda tidak't dapat mengubah string's ukuran. Anda terutama harus berhati-hati untuk tidak menambahkan karakter melewati akhir dari string atau anda'll mendapatkan buffer overrun (dan kemungkinan kecelakaan).Tidak ada jaminan bahwa semua karakter akan menjadi bagian yang sama bersebelahan penyangga sampai C++11, tetapi dalam prakteknya semua dikenal implementasi
std::string
bekerja dengan cara itu pula, lihat Artinya "&s[0]" titik bersebelahan karakter di std::string?.Perhatikan bahwa banyak
string
fungsi anggota akan mengalokasikan buffer internal dan membatalkan pointer anda mungkin telah disimpan. Terbaik untuk menggunakan mereka segera dan kemudian buang.C++17
C++17 (standar mendatang) perubahan sinopsis template
basic_string
menambahkan non-const overloaddata()
:Grafik const *
daristd::basic_string<Grafik>
Grafik *
daristd::basic_string<Grafik>
C++11
Grafik const *
daristd::basic_string<Grafik>
Grafik *
daristd::basic_string<Grafik>
Dari C++11 dan seterusnya, standar says:
Ada dapat dipisahkan cara yang mungkin untuk mendapatkan non-const karakter pointer.
1. Gunakan bersebelahan penyimpanan C++11
Pro
Karena ...
'\0'
ini tidak dapat diubah-ubah / tidak harus selalu menjadi bagian dari non-const memori.2. Gunakan
std::vektor<Grafik>
Pro
Karena ...
3. Gunakan
std::array<Grafik, N>
jikaN
adalah waktu kompilasi konstan (dan cukup kecil)Pro
Karena ...
4. Baku alokasi memori dengan penyimpanan otomatis penghapusan
Pro
Karena ...
5. Baku alokasi memori dengan penanganan secara manual
Pro
Con
Saya bekerja dengan API dengan banyak fungsi bisa sebagai masukan
char*
.Saya telah menciptakan sebuah kelas kecil untuk menghadapi masalah seperti ini, saya telah menerapkan RAII idiom.
Dan anda dapat menggunakannya sebagai:
Saya telah disebut kelas
DeepString
karena itu adalah menciptakan mendalam dan unik menyalin (DeepString
tidak copyable) yang ada string.Hanya melihat ini :
Namun , perhatikan bahwa ini akan kembali
const char *
.Untukchar *
, gunakanstrcpy
untuk menyalin ke lainchar
array.Coba ini