我有一串看起来像
的数据string line = "Number:Description:Price:Weight";
我想通过分隔符“:”将字符串分成4个不同的变量。我是通过子串方法
来尝试的char delimiter = ':';
string number = line.substr(0, line.find(delimiter));
它适用于第一个变量。但是,我无法弄清楚如何迭代到其他变量的“:”的下一个实例。
答案 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已经完全符合您的要求。