Подтвердить что ты не робот

Как получить хвост std::string?

Как получить хвост std::string?

Если бы желания могли сбыться, это сработало бы так:

string tailString = sourceString.right(6);

Но это кажется слишком простым и не работает...

Любое приятное решение?

Дополнительный вопрос: как это сделать с библиотекой алгоритмов Boost string?

ДОБАВЛЕНО:

Метод должен быть сохранен, даже если исходная строка меньше 6 символов.

4b9b3361

Ответ 1

Существует одна предостерегающая информация: если substr вызывается с положением за конец массива (превосходит size), то генерируется исключение 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);

Ответ 2

Используя метод substr() и size() строки, просто получите последнюю его часть:

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

Для обработки случая строки, меньшей размера хвоста, см. ответ Benoit (и повышайте его, я не понимаю, почему я получаю 7 upvotes, в то время как Benoit предоставляет более полный ответ!)

Ответ 3

Вы можете сделать:

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

Обратите внимание, что npos является аргументом по умолчанию и может быть опущен. Если ваша строка имеет размер, превышающий 6, то эта процедура будет извлекать всю строку.

Ответ 4

Это должно сделать это:

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));

Ответ 5

Вы можете использовать итераторы для этого:

   #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

Ответ 6

Поскольку вы также попросили решение с помощью библиотеки boost:

#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());
} 

Ответ 7

Попробуйте substr метод.

Ответ 8

Я думаю, использование итераторов - это С++ way

Что-то вроде этого:

#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;
}

Ответ 9

Попробуйте следующее:

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

Ответ 10

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