拆分字符串但保留空标记c ++

时间:2015-06-12 07:38:07

标签: c++ tokenize

我正在尝试拆分字符串并将其放入矢量

但是,每当有连续的​​分隔符时,我也想保留一个空标记:

例如:

replace LAPSE2 with Base2.LAPSE for seek(GROUP_T + POL, [Base2])

我想将此字符串标记为:;分隔符 但在诸如::和;之间的分隔符之间 我想在我的向量中插入一个空字符串;

string mystring = "::aa;;bb;cc;;c"

另外我的要求是不要使用升级库。

如果有任何可以借给我一个想法。

感谢

标记字符串但不包含空标记的代码

so my desired output for this string is:

"" (empty)
aa
"" (empty)
bb
cc
"" (empty)
c

2 个答案:

答案 0 :(得分:4)

您可以使用一些简单的更改来使算法正常工作。首先,不要在开头跳过分隔符,然后不要在字符串中间跳过分隔符,只需将位置增加1即可。此外,您的npos检查应确保两个位置都不是npos,因此它应该是&&而不是||

void Tokenize(const string& str,vector<string>& tokens, const string& delimiters)
{
    // Start at the beginning
    string::size_type lastPos = 0;
    // Find position of the first delimiter
    string::size_type pos = str.find_first_of(delimiters, lastPos);

    // While we still have string to read
    while (string::npos != pos && string::npos != lastPos)
    {
        // Found a token, add it to the vector
        tokens.push_back(str.substr(lastPos, pos - lastPos));
        // Look at the next token instead of skipping delimiters
        lastPos = pos+1;
        // Find the position of the next delimiter
        pos = str.find_first_of(delimiters, lastPos);
    }

    // Push the last token
    tokens.push_back(str.substr(lastPos, pos - lastPos));
}

答案 1 :(得分:2)

我有一个使用 iterators 的版本:

std::vector<std::string> split_from(const std::string& s
    , const std::string& d, unsigned r = 20)
{
    std::vector<std::string> v;
    v.reserve(r);

    auto pos = s.begin();
    auto end = pos;

    while(end != s.end())
    {
        end = std::find_first_of(pos, s.end(), d.begin(), d.end());
        v.emplace_back(pos, end);
        pos = end + 1;
    }

    return v;
}

使用您的界面:

void Tokenize(const std::string& s, std::vector<std::string>& tokens
    , const std::string& delims)
{
    auto pos = s.begin();
    auto end = pos;

    while(end != s.end())
    {
        end = std::find_first_of(pos, s.end(), delims.begin(), delims.end());
        tokens.emplace_back(pos, end);
        pos = end + 1;
    }
}