C ++ помещает результаты от парсера в массив - PullRequest
0 голосов
/ 20 февраля 2019

Я новичок в C ++.

Я хотел бы знать, как я могу разобрать строку и поместить результат в массив.

Итак, представьте, что у меня есть такая строка: 104.8 10.9 7.8e-33 2.6e-29 59 248 .. 46 230 .. 20 336 .. 0.87

Это всегда один и тот же стиль, это означает, что 14 не [:space:] разделено переменным числом пробелов между ними.

Я бы хотел проанализировать с помощью регулярных выражений и поместить эти значения в массив.Поскольку мы знаем, сколько совпадений мы можем установить для массива длиной 14 char array[14];

Заранее благодарим за любую помощь.

1 Ответ

0 голосов
/ 20 февраля 2019

Предполагая, что эти данные уже содержатся в std::string, я бы предложил решение, используя std::stringstream, в частности, std::istringstream.

Я вижу, что выимеют как действительные числа (104.8, 7.8e-33), так и строки (..), которые, как я предполагал, также считаются отдельными и действительными токенами.В этом случае мы можем разделить ваши данные на отдельные std::string s:

#include <iostream>
#include <sstream> // std::stringstream family
#include <array>
#include <string>

int main() {
    std::string data{"104.8  10.9   7.8e-33   2.6e-29      59" // string concatenation
                     "248 ..      46     230 ..      20   336 .. 0.87"};

    std::istringstream stream{data}; // helper stream

    // Assuming that we're certain that *data* holds exactly 14 tokens, we can
    // use a simple loop. Otherwise we would've needed to check stream's state
    // after every operation.

    std::array<std::string, 14> tokens{};

    for(std::size_t i{0}; i < 14; ++i) {
        stream >> tokens[i];
    }

    // lastly, we can print the results:

    for(const auto& token : tokens) {
        std::cout << token << ' ';
    }
}

При этом будет напечатано: 104.8 10.9 7.8e-33 2.6e-29 59248 .. 46 230 .. 20 336 .. 0.87.

Обратите внимание, что дополнительные пробелы между токенами исчезли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...