Hapus karakter terakhir dari string C ++

210

Bagaimana saya bisa menghapus karakter terakhir dari string C ++?

Saya mencoba st = substr(st.length()-1);tetapi tidak berhasil.

skazhy
sumber
6
Apakah Anda ingin string baru dengan karakter terakhir dihapus atau string yang sama tanpa karakter terakhir?
Matthieu M.
Untuk MFC Visual C ++ CString: CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
sergiol

Jawaban:

193

Untuk versi yang tidak bermutasi:

st = myString.substr(0, myString.size()-1);
Matthieu M.
sumber
20
@ MatthieuM. Contoh Anda membingungkan, saya pikir inti dari pertanyaan adalah untuk memodifikasi string asli, dalam contoh Anda Anda tidak mengubah string asli, karena dalam contoh Anda string asli disebut "myString" yang memberikan kebingungan, dalam pertanyaan itu adalah "st". Kode Anda harus: 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".
Czarek Tomczak
1
@CzarekTomczak: Saya mengerti ini bukan apa yang diminta, jadi penafian sebelum inti sebenarnya.
Matthieu M.
2
@MattPhillips: solusinya adalah spesifik C ++ 11 ( pop_backtidak 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.
Matthieu M.
404

Solusi sederhana jika Anda menggunakan C ++ 11. Mungkin juga O (1) kali:

st.pop_back();
mpgaillard
sumber
49
ini untuk c ++ 11!
Amir
1
Sebagai FYI - yang didukung hanya dari GCC 4.7 (tentunya dengan w / the -std = c ++ 11 switch kompilasi)
Shmil The Cat
20
Jangan lupa periksa length().
Ya, itu muncul terlalu jauh di bawah halaman ..!
James Bedford
1
The behavior is undefined if the string is empty. dari sini
Raffi
24
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.

Steve314
sumber
11
Tidak ada std::string::pop_backdalam C ++ 03; sudah ditambahkan di C ++ 0x.
James McNellis
Ok terima kasih. Ini menyebabkan sedikit kebingungan - saya bersumpah saya telah menggunakannya, tetapi itu tidak ada. Mungkin saya memiliki pustaka non-standar di beberapa kompiler di suatu tempat (antara VC ++ 2003, VC ++ 2008, MinGW GCC3, MinGW GCC 4 dan Linux GCC 4, Anda mendapatkan beberapa perbedaan). Lebih mungkin, saya hanya bingung dengan jenis lain.
Steve314
mengubah ukuran () mungkin tidak dimaksudkan untuk penggunaan seperti itu, ini adalah fungsi terkait memori, hapus () adalah untuk menghapus karakter.
Czarek Tomczak
3
@Czarek Tomczak - maaf atas keterlambatan keterlambatan jawaban, tetapi resizemerupakan fungsi mengubah ukuran, dan tidak ada lagi fungsi memori yang hal lain yang dapat meningkatkan memori yang dibutuhkan. Misalnya, jika Anda resizeke 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 .
Steve314
3
if (! str.empty ()) lebih disukai daripada ukuran
ericcurtin
19
buf.erase(buf.size() - 1);

Ini mengasumsikan Anda tahu bahwa string tidak kosong. Jika demikian, Anda akan mendapatkan out_of_rangepengecualian.

RC.
sumber
8
buf [buf.size () - 1] = '\ 0'; tidak menghapus apa pun - itu hanya mengubah karakter yang ada di sana untuk memiliki nilai nol. std:; string dengan senang hati bisa mengandung karakter tersebut.
Neil benar. Saya mungkin harus menjelaskan ini dalam jawaban saya. Opsi kedua akan secara efektif mengubah nilai karakter terakhir sehingga tidak akan dicetak, tetapi panjang string tetap sama. Menggunakan hapus sebenarnya "menghilangkan" karakter terakhir dan akan mengubah ukuran string.
RC.
@RC Akan dicetak, dengan asumsi Anda menggunakan sesuatu seperti cout << buf. Bagaimana tampilannya akan tergantung pada platform Anda. Dan Anda selalu dapat mengklarifikasi dengan mengedit jawaban Anda.
Apa yang jauh lebih baik size() daripada end()jawaban lain?
ribamar
17

str.erase( str.end()-1 )

Referensi: std :: string :: erase () prototipe 2

tidak diperlukan c ++ 11 atau c ++ 0x.

ribamar
sumber
1
Ini dapat menyebabkan situasi aneh: ukuran string telah berkurang tetapi karakter terakhir tidak disetel ke '\ 0'.
Deqing
1
@Deqing dapatkah Anda memberikan detail lebih lanjut tentang apa yang terjadi dalam kasus seperti itu?
ribamar
Sebagai contoh jika Anda telah string s("abc");, setelah menghapus tampaknya bekerja: cout<<s; // prints "ab"Namun, karakter terakhir masih ada: cout<<s[2]; // still prints 'c'.
Deqing
1
mudah diperbaiki: hanyastr[str.length()-1] = 0; str.erase(str.end()-1);
taxilian
5
@Dequing: contoh Anda tidak valid. Penghapusan mengurangi ukuran string, sehingga akses ke s[2]ilegal.
EML
11

Itu yang Anda butuhkan:

#include <string>  //string::pop_back & string::empty

if (!st.empty())
    st.pop_back();
jcrv
sumber
9
int main () {

  string str1="123";
  string str2 = str1.substr (0,str1.length()-1);

  cout<<str2; // output: 12

  return 0;
}
codaddict
sumber
2

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
Michael Goldshteyn
sumber
2

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.

Zebra
sumber
Metode ini juga bermasalah, karakter terakhir tidak disetel ke '\ 0'.
Deqing
1
Ada alasan khusus untuk tidak melakukan str.erase(str.end() - 1)?
vallentin
-4

Jika panjangnya bukan nol, Anda juga bisa

str[str.length() - 1] = '\0';
Jan Glaser
sumber
4
Mengatur karakter terakhir agar \0tidak mengubah panjang string. str.length()akan tidak akurat.
jww
Ya, saya melihatnya sekarang. Kami sedang mempertimbangkan C ++. Anda benar, itu tidak mengubah panjang string
Jan Glaser