我有一个字符串对象,如:
string test = "
[3, 4, 8, 10, 10]\n[12]\n[12, 10,\n 20]
"
我试图将其解析为等于[3,4,8,10,10],[12]和[12,10,20]的3个独立数组。我之前已经将逗号分隔的整数解析为数组但是如何解析这个整数。不幸的是,我拥有的数据可以在数组中使用换行符,否则我将使用“getline”函数(将文件读入字符串时)并简单地忽略括号。
似乎我需要首先将每个数组放入由括号分隔的自己的字符串中,然后通过逗号删除将每个数组解析为整数数组。这会有用吗?
如果是这样,我如何用括号将字符串拆分成以前未知数量的其他字符串?
答案 0 :(得分:3)
您可以使用流和std::getline()
,因为std::getline()
将分隔符作为参数:
int main()
{
std::string test = "[3, 4, 8, 10, 10]\n[12]\n[12, 10,\n 20]";
// make data a stream (could be a std::ifstream)
std::istringstream iss(test);
// working vars
std::string skip, item;
// between square braces
// skip to the opening '[' then getline item to the closing ']'
while(std::getline(std::getline(iss, skip, '['), item, ']'))
{
// item = "3, 4, 8, 10, 10"
// store numbers in a vector (not array)
std::vector<int> v;
// convert item to a stream
std::istringstream iss(item);
// separated by commas
while(std::getline(iss, item, ','))
v.push_back(std::stoi(item));
// display the results
std::cout << "list:" << '\n';
for(auto i: v)
std::cout << "\t" << i << '\n';
}
}
<强>输出:强>
list:
3
4
8
10
10
list:
12
list:
12
10
20
答案 1 :(得分:1)
如果您已经将整个内容读入字符串,则以下内容应该有效:
#include <iostream>
#include <string>
using namespace std;
int main() {
string test = "[3, 4, 8, 10, 10]\n[12]\n[12, 10,\n 20]";
size_t start = 0; // first position in the string
// find the first occurance of "]"
size_t pos = test.find("]");
while ( pos != string::npos ) {
// move to position after "]"
// so it is included in substring
pos += 1;
// create a substring
string subStr = test.substr(start, pos-start);
// remove newlines from new string
size_t newLinePos = subStr.find("\n");
while ( newLinePos != string::npos ) {
subStr.erase(newLinePos,1);
newLinePos = subStr.find("\n");
}
// here is the substring, like: [12, 10, 20]
cout << "Substring: " << subStr << endl;
// update start position for next substring
start = pos;
// find next occurrance of "]"
pos = test.find("]", pos);
}
}
答案 2 :(得分:0)
解决此问题的一种方法是使用explode()函数。 explode()的实现将基于给定的分隔符将字符串分成多个字符串。它不是最有效的方法,但它可以产生很多直观的意义。
请参阅: Is there an equivalent in C++ of PHP's explode() function?