从C++字符串中删除最后一个字符

ska*_*zhy 195 c++ string substring

如何从C++字符串中删除最后一个字符?

我试过st = substr(st.length()-1);但它没用.

小智 363

如果您使用C++ 11,可以使用简单的解决方案 也可能是O(1)时间:

st.pop_back();
Run Code Online (Sandbox Code Playgroud)

  • 这是针对c ++ 11的! (45认同)
  • 别忘了检查`length()`. (17认同)
  • `如果字符串为空,则行为未定义。` 来自[此处](https://en.cppreference.com/w/cpp/string/basic_string/pop_back) (2认同)

Mat*_* M. 180

对于非变异版本:

st = myString.substr(0, myString.size()-1);
Run Code Online (Sandbox Code Playgroud)

  • @MatthieuM.你的例子令人困惑,我认为问题的本质是修改原始字符串,在你的例子中你没有修改原始字符串,因为在你的例子中,原始字符串被称为"myString",这给混乱,在问题中它是"st".你的代码应该是:`st = st.substr(0,st.size() - 1)`.但它看起来仍然不正确,我认为正确的方法是使用专门用于此任务的函数,它被称为erase(),代码是:`st.erase(st.size() - 1)`.这将被称为"变异版本". (19认同)
  • 实际上@ user2397962下面有正确的答案. (5认同)
  • @CzarekTomczak:我知道这并不是我们所要求的,因此是实际要点之前的免责声明。 (3认同)
  • @MattPhillips:他的解决方案是C++ 11特定的(`pop_back`在C++ 03中不存在),它也是一个就地修改(并且OP从未澄清他是否想要就地). ..因此,他有一个正确的答案,但不是唯一可能的答案. (2认同)

Ste*_*314 23

if (str.size () > 0)  str.resize (str.size () - 1);
Run Code Online (Sandbox Code Playgroud)

std :: erase替代方案很好,但我喜欢" - 1"(无论是基于大小还是结束迭代器) - 对我而言,它有助于表达意图.

BTW - 真的没有std :: string :: pop_back吗? - 好像很奇怪.

  • C++ 03中没有`std :: string :: pop_back`; 但它已被添加到C++ 0x中. (11认同)
  • @Czarek Tomczak - 对于荒谬的迟到回复感到抱歉,但是`resize`是一个调整大小的函数,并且没有更多的内存函数可以增加所需的内存.例如,如果你"调整大小"到较小的大小,它将*不*减少保留的内存.我想你正在考虑`reserve`,至少*可能*减少分配的内存,如果被要求 - 参见[resize here](http://www.cplusplus.com/reference/string/string/resize/)和[此处保留](http://www.cplusplus.com/reference/string/string/reserve/). (3认同)
  • if (!str.empty()) 比大小更受欢迎 (3认同)

RC.*_*RC. 18

buf.erase(buf.size() - 1);
Run Code Online (Sandbox Code Playgroud)

这假设您知道该字符串不为空.如果是这样,你会得到一个out_of_range例外.

  • buf [buf.size() - 1] ='\ 0'; 不删除任何东西 - 它只是更改那里的字符值为零.std :;字符串可以很乐意包含这样的字符. (8认同)

rib*_*mar 14

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

参考:std :: string :: erase()原型2

不需要c ++ 11或c ++ 0x.

  • @Dequing:你的例子无效.擦除减少了字符串的大小,因此访问`s [2]`是非法的. (5认同)
  • EML 是正确的。这就是为什么每次要逐个字符访问并期望 \0 终端时使用 c_str() 都很重要。否则,访问 std:string 的唯一正确方法是使用迭代器。 (2认同)

cod*_*ict 8

int main () {

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

  cout<<str2; // output: 12

  return 0;
}
Run Code Online (Sandbox Code Playgroud)


jcr*_*crv 7

这就是您所需要的:

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

if (!st.empty())
    st.pop_back();
Run Code Online (Sandbox Code Playgroud)