提问者:小点点

在C++中使用字符串分隔符解析(拆分)字符串(标准C++)


我正在用C++解析一个字符串,使用的方法如下:

using namespace std;

string parsed,input="text to be parsed";
stringstream input_stringstream(input);

if (getline(input_stringstream,parsed,' '))
{
     // do some processing.
}

使用单个字符分隔符进行解析是很好的。但是如果我想使用字符串作为分隔符呢。

示例:我想拆分:

scott>=tiger

作为分隔符,以便我可以得到scott和Tiger。


共3个答案

匿名用户

您可以使用函数查找字符串分隔符的位置,然后使用获取令牌。

示例:

std::string s = "scott>=tiger";
std::string delimiter = ">=";
std::string token = s.substr(0, s.find(delimiter)); // token is "scott"

> 函数返回在字符串中首次出现的位置,如果未找到字符串,则返回

函数返回对象的子字符串,从位置开始,长度

如果您有多个分隔符,在您提取了一个令牌之后,您可以删除它(包括分隔符)以继续后续的提取(如果您想保留原始字符串,只需使用

s.erase(0, s.find(delimiter) + delimiter.length());

通过这种方式,您可以轻松地循环获取每个令牌。

std::string s = "scott>=tiger>=mushroom";
std::string delimiter = ">=";

size_t pos = 0;
std::string token;
while ((pos = s.find(delimiter)) != std::string::npos) {
    token = s.substr(0, pos);
    std::cout << token << std::endl;
    s.erase(0, pos + delimiter.length());
}
std::cout << s << std::endl;

输出:

scott
tiger
mushroom

匿名用户

此方法使用,通过记住前一个子字符串标记的开头和结尾而不改变原始字符串。

#include <iostream>
#include <string>

int main()
{
    std::string s = "scott>=tiger";
    std::string delim = ">=";

    auto start = 0U;
    auto end = s.find(delim);
    while (end != std::string::npos)
    {
        std::cout << s.substr(start, end - start) << std::endl;
        start = end + delim.length();
        end = s.find(delim, start);
    }

    std::cout << s.substr(start, end);
}

匿名用户

可以使用next函数拆分字符串:

vector<string> split(const string& str, const string& delim)
{
    vector<string> tokens;
    size_t prev = 0, pos = 0;
    do
    {
        pos = str.find(delim, prev);
        if (pos == string::npos) pos = str.length();
        string token = str.substr(prev, pos-prev);
        if (!token.empty()) tokens.push_back(token);
        prev = pos + delim.length();
    }
    while (pos < str.length() && prev < str.length());
    return tokens;
}

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|中使|字符串|分隔符|解析|拆分|字符串|标准|c++)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?