获取具有相同分隔符的多个实例的字符串的子字符串

时间:2018-04-11 19:53:57

标签: c++

我有一串看起来像

的数据
string line = "Number:Description:Price:Weight";

我想通过分隔符“:”将字符串分成4个不同的变量。我是通过子串方法

来尝试的
char delimiter = ':';
string number = line.substr(0, line.find(delimiter));

它适用于第一个变量。但是,我无法弄清楚如何迭代到其他变量的“:”的下一个实例。

4 个答案:

答案 0 :(得分:1)

std::string::find()将起始索引作为可选参数:

string line = "Number:Description:Price:Weight";
string::size_type start, end;
char delimiter = ':';

end = line.find(delimiter);
string number = line.substr(0, end);

start = end + 1;
end = line.find(delimiter, start);
string desc = line.substr(start, end-start);

start = end + 1;
end = line.find(delimiter, start);
string price = line.substr(start, end-start);

string weight = line.substr(end + 1);

或者,您可以使用std::istringstream std::getline()将字符串拆分为分隔符:

string line = "Number:Description:Price:Weight";
string number, desc, price, weight;
char delimiter = ':';

istringstream iss(line);
getline(iss, number, delimiter);
getline(iss, desc, delimiter);
getline(iss, price, delimiter);
getline(iss, weight);

答案 1 :(得分:0)

使用简单的for循环会更容易:

#include <iostream>
#include <vector>

int main()
{
    std::string line = "Number:Description:Price:Weight";

    std::vector<std::string> vecStrings;
    std::string word;
    size_t count = 0;

    for (auto const& it : line)
    {
        if (it != ':') word += it;

        if ((it == ':') || (count + 1 == line.size()))
        {
             vecStrings.emplace_back(word);
             word.clear();
        }
        ++count;
    }

    for(const auto& it: vecStrings) 
        std::cout << it << "\n";

    return 0;
}

查看实时操作:https://www.ideone.com/DiAvjO

更新:如果您需要不同的内容,可以使用std::for_each()lambda执行相同操作:

#include <algorithm>

std::for_each(std::begin(line), std::end(line), [&](char &letter)
{
    if (letter != ':') word += letter;
    if ((letter == ':') || (count + 1 == line.size()))
    {
        vecStrings.emplace_back(word);
        word.clear();
    }
    ++count;
});

然而,更简单的解决方案是使用std::istringstream。感谢RemyLebeau指出:

#include <sstream>

std::stringstream sstr(line);
std::string word;

while (std::getline(sstr, word, ':'))
{
    vecStrings.emplace_back(word);
} 

答案 2 :(得分:0)

你可以使用下面的strtok

#include <string.h>
int main()
{
    char line[] = "Number:Description:Price:Weight";

    char * token = std::strtok (line,":");

    while (token != NULL)
    {
        cout << token << '\n';
        token = std::strtok(NULL, ":");
    }
    return 0;
}

根据需要进行必要的更改

答案 3 :(得分:-2)

cstring已经完全符合您的要求。