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

C++ 获取具有同一分隔符的多个实例的字符串的子字符串,c++,C++,我有一组数据,看起来像 string line = "Number:Description:Price:Weight"; 我想通过分隔符“:”将字符串分成4个不同的变量。我是通过子串方法来尝试的 char delimiter = ':'; string number = line.substr(0, line.find(delimiter)); 对于第一个变量,它可以正常工作。但是,对于其他变量,我不知道如何迭代到“:”的下一个实例。cstring有一个strtok,它可以完全满足您的需要。

我有一组数据,看起来像

string line = "Number:Description:Price:Weight";
我想通过分隔符“:”将字符串分成4个不同的变量。我是通过子串方法来尝试的

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

对于第一个变量,它可以正常工作。但是,对于其他变量,我不知道如何迭代到“:”的下一个实例。

cstring有一个strtok,它可以完全满足您的需要。

使用一个简单的
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;
}
然而,一个更简单的解决方案是使用
std::istringstream
。感谢RemyLebeau指出这一点:

#include <sstream>

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

while (std::getline(sstr, word, ':'))
{
    vecStrings.emplace_back(word);
} 
#包括
std::stringstream sstr(线路);
字符串字;
while(std::getline(sstr,word,,:'))
{
vecStrings.emplace_back(单词);
} 
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()
,拆分分隔符上的字符串:


您可以像下面这样使用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;
}
#包括
int main()
{
字符行[]=“编号:说明:价格:重量”;
char*token=std::strtok(行“:”);
while(令牌!=NULL)
{

最多只能说这是一个糟糕的答案。最糟糕的是它不是一个。你试过理解为什么吗?哦,太棒了,工作得很好,谢谢你的答案!这样的循环使用
std::istringstream
std::getline()
,例如:
istringstream-iss(line);while(getline(iss,word,,:'){vecStrings.push_-back(word)}
@RemyLebeau:是的,我在评论部分看到了这个链接。谢谢你。一个简单的任务有这么多代码:/
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);
#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;
}