Bagaimana saya bisa menghapus karakter terakhir dari string C ++?
Saya mencoba st = substr(st.length()-1);
tetapi tidak berhasil.
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
Bagaimana saya bisa menghapus karakter terakhir dari string C ++?
Saya mencoba st = substr(st.length()-1);
tetapi tidak berhasil.
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
Jawaban:
Untuk versi yang tidak bermutasi:
st = myString.substr(0, myString.size()-1);
st = st.substr(0, st.size()-1)
. Tapi itu masih tidak terlihat dengan cara yang benar, saya berpikir bahwa cara yang tepat adalah dengan menggunakan fungsi yang dimaksudkan untuk tugas ini, itu disebut menghapus () dan kode ini: st.erase(st.size()-1)
. Ini akan disebut "versi mutasi".
pop_back
tidak ada di C ++ 03) dan ini juga merupakan modifikasi di tempat (dan OP tidak pernah mengklarifikasi apakah ia ingin ada atau tidak) ... karena seperti, ia memiliki sebuah jawaban yang benar, tetapi bukan satu-satunya yang mungkin.
Solusi sederhana jika Anda menggunakan C ++ 11. Mungkin juga O (1) kali:
st.pop_back();
if (str.size () > 0) str.resize (str.size () - 1);
Alternatif std :: erase baik, tapi saya suka "- 1" (baik berdasarkan ukuran atau end-iterator) - bagi saya, ini membantu mengekspresikan maksud.
BTW - Apakah benar-benar tidak ada std :: string :: pop_back? - sepertinya aneh.
std::string::pop_back
dalam C ++ 03; sudah ditambahkan di C ++ 0x.
resize
merupakan fungsi mengubah ukuran, dan tidak ada lagi fungsi memori yang hal lain yang dapat meningkatkan memori yang dibutuhkan. Misalnya, jika Anda resize
ke ukuran yang lebih kecil, itu tidak akan mengurangi memori yang dipesan. Saya pikir Anda sedang memikirkan reserve
, yang setidaknya dapat mengurangi memori yang dialokasikan jika diminta untuk - lihat mengubah ukuran di sini dan memesan di sini .
buf.erase(buf.size() - 1);
Ini mengasumsikan Anda tahu bahwa string tidak kosong. Jika demikian, Anda akan mendapatkan out_of_range
pengecualian.
size()
daripada end()
jawaban lain?
str.erase( str.end()-1 )
Referensi: std :: string :: erase () prototipe 2
tidak diperlukan c ++ 11 atau c ++ 0x.
string s("abc");
, setelah menghapus tampaknya bekerja: cout<<s; // prints "ab"
Namun, karakter terakhir masih ada: cout<<s[2]; // still prints 'c'
.
str[str.length()-1] = 0; str.erase(str.end()-1);
s[2]
ilegal.
Dengan C ++ 11, Anda bahkan tidak perlu panjang / ukuran. Selama string tidak kosong, Anda dapat melakukan hal berikut:
if (!st.empty())
st.erase(std::prev(st.end())); // Erase element referred to by iterator one
// before the end
str.erase(str.begin() + str.size() - 1)
str.erase(str.rbegin())
sayangnya tidak mengkompilasi, karena reverse_iterator
tidak dapat dikonversi ke normal_iterator.
C ++ 11 adalah teman Anda dalam hal ini.
str.erase(str.end() - 1)
?
Jika panjangnya bukan nol, Anda juga bisa
str[str.length() - 1] = '\0';
\0
tidak mengubah panjang string. str.length()
akan tidak akurat.