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

时间:2011-09-29 12:23:48

标签: c++

如何检索std::string的尾部?

如果愿望成真,它会像那样工作:

string tailString = sourceString.right(6);

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

有什么好的解决方案吗?

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

增加:

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

10 个答案:

答案 0 :(得分:34)

有一点值得注意:如果调用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

您可以将其用作:

std::string t = tail(source, 6);

答案 1 :(得分:13)

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

string tail = source.substr(source.size() - 6);

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

答案 2 :(得分:10)

你可以这样做:

std::string tailString = sourceString.substr((sourceString.length() >= 6 ? sourceString.length()-6 : 0), std::string::npos);

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

答案 3 :(得分:6)

这应该这样做:

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

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

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

答案 4 :(得分:3)

您可以使用迭代器执行此操作:

   #include <iostream>
   #include <string>
   using namespace std;

   int main () 
   {
        char *line = "short line for testing";
        // 1 - start iterator
        // 2 - end iterator
        string temp(line);

        if (temp.length() >= 8) { // probably want at least one or two chars
        // otherwise exception is thrown
            int cut_len = temp.length()-6;
            string cut (temp.begin()+cut_len,temp.end());
            cout << "cut  is: " << cut << endl;
        } else {
            cout << "Nothing to cut!" << endl;
        }
        return 0;
    }

输出:

cut  is: esting

答案 5 :(得分:2)

由于您还要求使用提升库提供解决方案:

#include "boost/algorithm/string/find.hpp"

std::string tail(std::string const& source, size_t const length) 
{
    boost::iterator_range<std::string::const_iterator> tailIt = boost::algorithm::find_tail(source, length);
    return std::string(tailIt.begin(), tailIt.end());
} 

答案 6 :(得分:0)

尝试substr方法。

答案 7 :(得分:0)

我认为,使用迭代器是C ++方式

类似的东西:

#include <string>
#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;

std::string tail(const std::string& str, size_t length){
    string s_tail;
    if(length < str.size()){
        std::reverse_copy(str.rbegin(), str.rbegin() + length, std::back_inserter(s_tail));
    }
    return s_tail;
}


int main(int argc, char* argv[]) {
    std::string s("mystring");
    std::string s_tail = tail(s, 6);
    cout << s_tail << endl;
    s_tail = tail(s, 10);
    cout << s_tail << endl;
    return 0;
}

答案 8 :(得分:0)

尝试以下方法:

std::string tail(&source[(source.length() > 6) ? (source.length() - 6) : 0]);

答案 9 :(得分:0)

string tail = source.substr(source.size() - min(6, source.size()));