Как я могу удалить последний символ из строки 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()будет неточным.