Как я могу удалить последний символ из строки C ++?
Я пытался, st = substr(st.length()-1);
но это не сработало.
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
Как я могу удалить последний символ из строки C ++?
Я пытался, st = substr(st.length()-1);
но это не сработало.
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
Ответы:
Для версии без мутаций:
st = myString.substr(0, myString.size()-1);
st = st.substr(0, st.size()-1)
. Но она по- прежнему не выглядит правильно, я думаю , что правильный способ заключается в использовании функции , которая предназначена для решения этой задачи, она называется Стирание () и код: st.erase(st.size()-1)
. Это будет называться "мутантной версией".
pop_back
не существовало в C ++ 03), и это также модификация на месте (и ОП никогда не уточнял, хочет ли он на месте или нет) ... как Таким образом , он имеет более правильный ответ, но не возможно только один.
Простое решение, если вы используете C ++ 11. Вероятно, O (1) время:
st.pop_back();
if (str.size () > 0) str.resize (str.size () - 1);
Альтернатива std :: erase хороша, но мне нравится "- 1" (независимо от размера или конечного итератора) - для меня это помогает выразить намерение.
Кстати, действительно ли нет std :: string :: pop_back? - кажется странным.
std::string::pop_back
в C ++ 03; это было добавлено в C ++ 0x, хотя.
resize
это функция изменения размера, и больше не функция памяти, как все, что может увеличить необходимую память. Например, если вы resize
уменьшите размер, это не уменьшит зарезервированную память. Я думаю, вы думаете о том reserve
, что, по крайней мере, может уменьшить объем выделяемой памяти, если будет предложено - см. Здесь изменить размер и зарезервировать здесь .
buf.erase(buf.size() - 1);
Это предполагает, что вы знаете, что строка не пуста. Если это так, вы получите out_of_range
исключение.
size()
вместо end()
другого ответа?
str.erase( str.end()-1 )
Ссылка: std :: string :: erase () прототип 2
не требуется c ++ 11 или c ++ 0x.
string s("abc");
, после того, как стирают кажется работающих: cout<<s; // prints "ab"
, однако, последний символ еще есть: cout<<s[2]; // still prints 'c'
.
str[str.length()-1] = 0; str.erase(str.end()-1);
s[2]
является незаконным.
С C ++ 11 вам даже не нужны длина / размер. Пока строка не пуста, вы можете сделать следующее:
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())
не компилируется к сожалению, так как reverse_iterator
не может быть преобразован в normal_iterator.
C ++ 11 в этом случае ваш друг.
str.erase(str.end() - 1)
?
Если длина не равна нулю, вы также можете
str[str.length() - 1] = '\0';
\0
не меняет длину строки. str.length()
будет неточным.