1

特定の URL の最後の N 個のセグメントを返す関数を作成する必要があります。境界条件は適切に処理する必要があります。Cで問題なく実行できますが、思いつく最高のC++バージョンは次のとおりです。N=2

string getLastNSegments(const string& url, int N)
{
    basic_string<char>::size_type found = 0, start = path.length()+1;

    int segments = 2;
    while (start && segments && (start = path.find_last_of('/', start-1)) != string::npos) {
        found = start;
        segments--;
    }

return url.substr(found);
}

cout << "result: " << getLastNSegments("/foo/bar/zoo", 2) << endl;

これを行うためのより慣用的な(STL +アルゴリズム)方法はありますか?

4

3 に答える 3

2

とを使用std::stringrfind()ます。

最後のインデックスをパラメーターとしてフィードして、rfind連続して呼び出します。Nこれで、探している文字列の開始インデックスが得substrられ、部分文字列を抽出するために使用できます。

std::string x("http:/example.org/a/b/abc/bcd");
int N = 3;
int idx = x.length();
while ( idx >= 0 && --N > 0 )
{
   idx = x.rfind('/',idx) - 1;
}
std::string final = x.substr(idx);
于 2012-07-31T23:23:24.613 に答える
0

ループを使用するだけで問題はありません.1回の呼び出しで必要なことを実行するSTL文字列関数を知りません。

ところで、 の最後の 3 つのセグメントを求めるとどうなりhttp://www.google.com/ますか?

私を古い学校と呼んでください、しかし個人的にはここでSTL検索を使用しません...これで何が問題なのですか:

if( N <= 0 || url.length() == 0 ) return "";

const char *str = url.c_str();
const char *start = str + url.length();
int remain = N;

while( --start != str )
{
    if( *start == '/' && --remain == 0 ) break;
}

return string(start);
于 2012-07-31T23:37:10.140 に答える
0

最後になりましたが、簡単なブースト スプリット ソリューション

string getLastNSegments(const string& url, int n)
{
    string selected;
    vector<string> elements;
    boost::algorithm::split(elements, url, boost::is_any_of("/"));

    for (int i = 0; i < min(n, int(elements.size())); i++)
        selected = "/" + elements.at(elements.size()-1-i) + selected;

    return selected;
}
于 2012-08-01T01:35:07.807 に答える