Bir C ++ dizesinden son karakteri nasıl kaldırabilirim?
Denedim st = substr(st.length()-1);ama işe yaramadı.
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
Bir C ++ dizesinden son karakteri nasıl kaldırabilirim?
Denedim st = substr(st.length()-1);ama işe yaramadı.
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
Yanıtlar:
Değişmeyen bir sürüm için:
st = myString.substr(0, myString.size()-1);
st = st.substr(0, st.size()-1). Ama yine de doğru şekilde görünmüyor, düzgün şekilde, 's denilen silme () bu görev için tasarlanmıştır işlevini kullanmaktır ve kod olduğunu düşünüyorum: st.erase(st.size()-1). Buna "mutasyona uğrayan versiyon" denir.
pop_backC ++ 03'te yoktu) ve aynı zamanda yerinde bir değişikliktir (ve OP, yerinde olmasını isteyip istemediğini asla açıklığa kavuşturmamıştır) ... böyle, elindeki bir değil, yalnızca olası bir doğru cevabı.
C ++ 11 kullanıyorsanız basit çözüm. Muhtemelen O (1) zamanı da:
st.pop_back();
if (str.size () > 0) str.resize (str.size () - 1);
Bir std :: erase alternatifi iyidir, ancak "- 1" i (bir boyuta veya son yineleyiciye bağlı olarak) seviyorum - bana niyetini ifade etmeye yardımcı olur.
BTW - Gerçekten hiçbir std :: string :: pop_back var mı? - tuhaf görünüyor.
std::string::pop_backC ++ 03'te hiç yoktur ; Yine de C ++ 0x içinde eklendi.
resizeyeniden boyutlandırma fonksiyonu ve artık hafızayı arttırabilecek başka bir şey olmayan bir hafıza fonksiyonu yok. Eğer Örneğin, resizedaha küçük bir boyuta, bu olacak değil saklıdır hafızayı azaltır. Sana ait konum düşünme düşünmek reserveen azından belki istenirse ayrılan hafızayı azaltmak - bakınız burada yeniden boyutlandırmak ve burada rezerv .
buf.erase(buf.size() - 1);
Bu, dizenin boş olmadığını bildiğinizi varsayar. Eğer öyleyse, bir out_of_rangeistisna alacaksınız .
size() yerine daha iyi ne olabilir end()?
str.erase( str.end()-1 )
Referans: std :: string :: erase () prototip 2
c ++ 11 veya c ++ 0x gerekmez.
string s("abc");, silme sonra çalışma görünüyor: cout<<s; // prints "ab"Ancak son karakteri hala orada: cout<<s[2]; // still prints 'c'.
str[str.length()-1] = 0; str.erase(str.end()-1);
s[2]yasa dışıdır.
C ++ 11 ile uzunluk / boyuta bile ihtiyacınız yoktur. Dize boş olmadığı sürece aşağıdakileri yapabilirsiniz:
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())maalesef derlenmediğinden reverse_iteratornormal_iterator değerine dönüştürülemez.
C ++ 11 bu durumda arkadaşınızdır.
str.erase(str.end() - 1)mı?
Uzunluk sıfır değilse, ayrıca
str[str.length() - 1] = '\0';
\0dizenin uzunluğunu değiştirmez. str.length()yanlış olacaktır.