Wie kann ich das letzte Zeichen aus einer C ++ - Zeichenfolge entfernen?
Ich habe es versucht, st = substr(st.length()-1);
aber es hat nicht funktioniert.
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
Wie kann ich das letzte Zeichen aus einer C ++ - Zeichenfolge entfernen?
Ich habe es versucht, st = substr(st.length()-1);
aber es hat nicht funktioniert.
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
Antworten:
Für eine nicht mutierende Version:
st = myString.substr(0, myString.size()-1);
st = st.substr(0, st.size()-1)
. Aber es sieht immer noch nicht richtig aus. Ich denke, dass der richtige Weg darin besteht, die für diese Aufgabe vorgesehene Funktion zu verwenden. Sie heißt erase () und der Code lautet : st.erase(st.size()-1)
. Dies würde als "mutierende Version" bezeichnet.
pop_back
gab es in C ++ 03 nicht) und es handelt sich auch um eine direkte Modifikation (und das OP hat nie geklärt, ob er an Ort und Stelle wollte oder nicht) ... as so hat er eine richtige Antwort, aber nicht die einzig mögliche.
Einfache Lösung, wenn Sie C ++ 11 verwenden. Wahrscheinlich auch O (1) Zeit:
st.pop_back();
if (str.size () > 0) str.resize (str.size () - 1);
Eine std :: erase-Alternative ist gut, aber ich mag die "- 1" (ob basierend auf einer Größe oder einem Enditerator) - für mich hilft sie, die Absicht auszudrücken.
Übrigens - Gibt es wirklich kein std :: string :: pop_back? - erscheint merkwürdig.
std::string::pop_back
in C ++ 03; Es wurde jedoch in C ++ 0x hinzugefügt.
resize
ist eine Größenänderungsfunktion und keine Speicherfunktion mehr als alles andere, was den benötigten Speicher erhöhen könnte. Wenn Sie beispielsweise resize
eine kleinere Größe wählen, wird der reservierte Speicher nicht reduziert. Ich denke, Sie denken darüber nach reserve
, was zumindest den zugewiesenen Speicher reduzieren könnte , wenn Sie dazu aufgefordert werden - siehe Größe hier ändern und hier reservieren .
buf.erase(buf.size() - 1);
Dies setzt voraus, dass Sie wissen, dass die Zeichenfolge nicht leer ist. In diesem Fall erhalten Sie eine out_of_range
Ausnahme.
size()
statt end()
einer anderen Antwort?
str.erase( str.end()-1 )
Referenz: std :: string :: erase () Prototyp 2
Kein c ++ 11 oder c ++ 0x erforderlich.
string s("abc");
, scheint es nach dem Löschen zu funktionieren: cout<<s; // prints "ab"
Das letzte Zeichen ist jedoch noch da : cout<<s[2]; // still prints 'c'
.
str[str.length()-1] = 0; str.erase(str.end()-1);
s[2]
unzulässig ist.
Mit C ++ 11 benötigen Sie nicht einmal die Länge / Größe. Solange die Zeichenfolge nicht leer ist, können Sie Folgendes tun:
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())
kompiliert leider nicht da reverse_iterator
nicht in einen normal_iterator konvertiert werden kann.
C ++ 11 ist in diesem Fall dein Freund.
str.erase(str.end() - 1)
?
Wenn die Länge nicht Null ist, können Sie auch
str[str.length() - 1] = '\0';
\0
ändert sich die Länge der Zeichenfolge nicht. str.length()
wird ungenau sein.