首页 > 解决方案 > 在 C++ 中出现字符之间/之后打印所有子字符串

问题描述

我试图在某个字符出现之间或之后获取所有子字符串。特别是搜索查询网址(获取选项),例如,如果我有:

std::string url = "https://www.google.com/search?q=i+need+help&rlz=1C1CHBF_enUS851US851&oq=i+need+help&aqs=chrome.0.69i59j0l3j69i60l2.4646j0j7&sourceid=chrome&ie=UTF-8"

我需要在“&”字符之间和之后(最后一次出现)输出字符串,因此输出将是:

rlz=1C1CHBF_enUS851US851 
oq=i+need+help
aqs=chrome.0.69i59j0l3j69i60l2.4646j0j7
sourceid=chrome 
ie=UTF-8

我了解如何使用一个字符串来执行此操作,但我一直试图将其实现为一个循环。这必须通过几个不同长度和选项数量的 url 来完成。

到目前为止,我只能在第一次和第二次出现字符之间抓取一个子字符串,但我需要在任何给定的 url 中抓取所有子字符串。

int a = url.find("&") + 1;
int b = url.find("&", url.find("&") + 1);
int c = (b - a);
std::string option = url.substr(a, c);

标签: c++stringsplit

解决方案


只需&在循环中从前一个元素中找到下一个元素,如果找不到&更多元素,则退出循环并处理第一个元素:

vector<string> foo(const string& url)
{
    vector<string> result;
    auto a = url.find("?");
    if (a == string::npos) return result;

    auto b = url.find("&");
    if (b == string::npos)
    {
        result.push_back(url.substr(a + 1, string::npos));
        return result;
    }
    result.push_back(url.substr(a + 1, b - a - 1));
    do
    {
        a = b;
        b = url.find("&", a + 1);
        result.push_back(url.substr(a + 1, b - a - 1));
    } while (b != string::npos);

    return result;
}

适用于您的示例:https ://ideone.com/SiRZQB


推荐阅读