用括号分割字符串中的参数

时间:2017-08-28 13:23:32

标签: c++ c++03

我想找到一种有效的方法来分割这种字符串并将参数存储在变量中:

param1 (param2 param3) (param4 param5) ... param6

示例:

1.  (10 10) (10 15) (2 11) 2.
1.  (12 20) 2.

(有一个未定义的括号,其中每个2个数字用空格分隔)

我必须将第一个和最后一个参数存储在double中,并将数字存储在矢量中的括号中。

对于第二个例子,它会给出:

double beginOfLine, endOfLine
vector<int> vec1;
vector<int> vec2;
beginOfLine = 1.;
endOfLine = 2.;
vec1.push_back(12);
vec2.push_back(20);

我觉得在python中很容易。但是在C ++中,我无法以简单的方式完成它。

nb:我不允许使用boost / C ++ 11及更高版本

1 个答案:

答案 0 :(得分:1)

由于您无法使用C ++ 11,因此使用std::stringstream进行一些基本字符串拆分可能会起作用。我不确定只要<limits>是C ++ 11的一部分,但您可以轻松地用另一个最大值替换它们。

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <limits>

int main()
{
    double beginOfLine = 0.0, endOfLine = 0.0;
    std::vector<int> vec1;
    std::vector<int> vec2;

    std::stringstream ss("1.  (10 10) (10 15) (2 11) 2.");

    ss >> beginOfLine;

    while (true) {
        int first, second;
        ss.ignore(std::numeric_limits<std::streamsize>::max(), '(');
        ss >> first >> second;
        vec1.push_back(first);
        vec2.push_back(second);
        ss.ignore(std::numeric_limits<std::streamsize>::max(), ')');
        ss.ignore(std::numeric_limits<std::streamsize>::max(), ' ');

        if (ss.peek() != '(') {
            ss >> endOfLine;
            break;
        }
    }

    std::cout << beginOfLine << '\n';
    for (std::vector<int>::iterator it = vec1.begin(); it != vec1.end(); ++it)
        std::cout << *it << ' ';
    std::cout << '\n';
    for (std::vector<int>::iterator it = vec2.begin(); it != vec2.end(); ++it)
        std::cout << *it << ' ';
    std::cout << '\n' << endOfLine;
    return 0;
}