基于分隔符的C ++字符串修改和提取
这是一个基本的问题,但我在考虑解决方案时遇到麻烦,所以我需要向正确的方向推动。
我有一个输入文件,我将它放入一个字符串变量中。 问题是我需要将这个字符串分成不同的东西。 将会有3个字符串和1个int。 它们由“:”分隔。
我知道我可以通过find()找到第一个“:”的位置,但我真的不知道如何通过字符串进行处理,并将它放入它自己的字符串/ int中。
该文件的实际输入如下所示:
A:PEP:909:Inventory Item
A将成为我必须执行的命令...所以这将是一个字符串。 PEP是一个关键,需要成为一个字符串。 909是一个int。
最后是一个字符串。
所以我想我想要做的是有3个字符串var和1个int,并将所有这些东西放到它们各自的变量中。
所以我想我最终会想把这个C ++字符串转换为一个C字符串,以便我可以使用atoi将一个部分转换为一个int。
用C风格的字符串,你可以使用strtok()来做到这一点。 你也可以使用sscanf()
但是既然你正在处理C ++,你可能想要坚持使用内置的std :: string函数。 这样你可以使用find()。 Find有一个表单,它接受第二个参数,即开始搜索的偏移量。 因此,您可以使用find(':')来查找第一个实例,然后使用find(':',firstIndex + 1)查找下一个实例,其中firstIndex是第一次调用find()时返回的值。
我通常使用这样的东西:
void split(const std::string &s, char delim, std::vector<std::string> &elems) {
std::stringstream ss(s);
std::string item;
while(std::getline(ss, item, delim)) {
elems.push_back(item);
}
}
你可以像这样使用它:
std::vector<std::string> tokens;
split("this:is:a:test", ':', tokens);
现在令牌将包含“this”,“is”,“a”和“test”
当你想使用C ++标准库时,最好使用std::getline
和std::istringstream
完成:
std::string command;
std::string key;
int id;
std::string item;
std::string line = "A:PEP:909:Inventory Item";
// for each line:
std::istringstream stream(line);
std::getline(stream, command, ':');
std::getline(stream, key, ':');
stream >> id;
std::getline(stream, item);
// now, process them
考虑把它放到一个自己的结构中:
struct record {
std::string command;
std::string key;
int id;
std::string item;
record(std::string const& line) {
std::istringstream stream(line);
stream >> *this;
}
friend std::istream& operator>>(std::istream& is, record & r){
std::getline(is, r.command, ':');
std::getline(is, r.key, ':');
stream >> r.id;
std::getline(is, r.item);
return is;
}
};
链接地址: http://www.djcxy.com/p/19555.html
上一篇: C++ Strings Modifying and Extracting based on Separators
下一篇: What has changed in gridviewdragdrop between ExtJs 4.2 and ExtJs 6.2