如何获取std :: string的尾部?

Ron*_*ean 28 c++

如何检索一个尾巴std::string

如果愿望成真,那就可以这样:

string tailString = sourceString.right(6);
Run Code Online (Sandbox Code Playgroud)

但这似乎太容易了,而且不起作用......

有什么好的解决方案?

可选问题:如何使用Boost字符串算法库?

添加:

即使原始字符串小于6个字符,该方法也应该保存.

Mat*_* M. 37

有一点值得注意:如果使用超出数组末尾的位置调用substr(优于大小),则out_of_range抛出异常.

因此:

std::string tail(std::string const& source, size_t const length) {
  if (length >= source.size()) { return source; }
  return source.substr(source.size() - length);
} // tail
Run Code Online (Sandbox Code Playgroud)

您可以将其用作:

std::string t = tail(source, 6);
Run Code Online (Sandbox Code Playgroud)

  • 您还可以轻松地将其作为模板来操作任何`basic_string <T>`,或者使用一些faff来使其在任何范围内运行,使用双向迭代器和带有`(迭代器,迭代器)的构造函数. (2认同)

Cha*_*esB 15

使用substr()方法和size()字符串,只需获取它的最后一部分:

string tail = source.substr(source.size() - 6);
Run Code Online (Sandbox Code Playgroud)

对于处理小于尾部大小的字符串的情况,请参阅Benoit的答案(并且支持它,我不明白为什么我得到7个upvotes而Benoit提供更完整的答案!)

  • 这是否适用于小于所需 6 个字符的字符串? (2认同)

Ben*_*oit 11

你可以这样做:

std::string tailString = sourceString.substr((sourceString.length() >= 6 ? sourceString.length()-6 : 0), std::string::npos);
Run Code Online (Sandbox Code Playgroud)

请注意,这npos是默认参数,可能会被省略.如果您的字符串的大小超过6,则此例程将提取整个字符串.

  • 第一个版本没有处理您认为的情况.因为`std :: string :: size_type`很可能是无符号的,`source.length()`将简单地"包裹"下溢,结果将是`std :: numeric_limits <std :: size_t> :: max () - 6 + source.length()`,远大于'0`.第二种方法是对的. (2认同)

rai*_*nes 6

这应该这样做:

string str("This is a test");
string sub = str.substr(std::max<int>(str.size()-6,0), str.size());
Run Code Online (Sandbox Code Playgroud)

甚至更短,因为subst的字符串结束为第二个参数的默认值:

string str("This is a test");
string sub = str.substr(std::max<int>(str.size()-6,0));
Run Code Online (Sandbox Code Playgroud)