Удалить последний символ из строки C ++ - PullRequest
186 голосов
/ 22 февраля 2010

Как я могу удалить последний символ из строки C ++?

Я пытался st = substr(st.length()-1); Но это не сработало.

Ответы [ 10 ]

341 голосов
/ 19 мая 2013

Простое решение, если вы используете C ++ 11. Вероятно, O (1) время:

st.pop_back();
171 голосов
/ 22 февраля 2010

Для версии без мутаций:

st = myString.substr(0, myString.size()-1);
23 голосов
/ 22 февраля 2010
if (str.size () > 0)  str.resize (str.size () - 1);

Альтернатива std :: erase хороша, но мне нравится "- 1" (на основе размера или конечного итератора) - мне это помогает выразить намерение.

Кстати - действительно ли нет std :: string :: pop_back? - кажется странным.

19 голосов
/ 22 февраля 2010
buf.erase(buf.size() - 1);

Предполагается, что вы знаете, что строка не пустая. Если это так, вы получите исключение out_of_range.

14 голосов
/ 13 марта 2014

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

Ссылка: std :: string :: erase () прототип 2

не требуется c ++ 11 или c ++ 0x.

8 голосов
/ 22 февраля 2010
int main () {

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

  cout<<str2; // output: 12

  return 0;
}
6 голосов
/ 07 декабря 2017

Это все, что вам нужно:

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

if (!st.empty())
    st.pop_back();
2 голосов
/ 25 апреля 2013

С C ++ 11 вам даже не нужны длина / размер.Пока строка не пуста, вы можете делать следующее:

if (!st.empty())
  st.erase(std::prev(st.end())); // Erase element referred to by iterator one
                                 // before the end
2 голосов
/ 02 марта 2013

str.erase(str.begin() + str.size() - 1)

str.erase(str.rbegin()), к сожалению, не компилируется, поскольку reverse_iterator не может быть преобразован в normal_iterator.

C ++ 11 в этом случае ваш друг.*

0 голосов
/ 26 марта 2018

Если длина не равна нулю, вы также можете

str[str.length() - 1] = '\0';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...