Как я могу извлечь целые числа из строки? - PullRequest
0 голосов
/ 24 марта 2020

Рассмотрим строку вида

"количество столбцов = 5 количество рядов = 345 1 3 -5 2 9 4 -10 34 -22 7 "

[За этим следует еще 343 строки. Однако, я думаю, этого будет достаточно, чтобы объяснить проблему.]

Я буду sh до извлечь значения 5 и 345 как целые числа. Подстроки «число столбцов =» и «количество строк =» известны, но количество цифр в значениях, за которыми следуют эти строки, неизвестно. Однако это Известно, что соответствующая строка заканчивается после значения. Я могу добраться до начала числа, используя следующий код

std::string searchString = "clause length = ";
int searchStringLength = searchString.length();
std::size_t startAt = result.find(searchString) + searchStringLength;

Однако я не знаю, как определить конец строки, используя который Я могу извлечь значения.

И следующая часть состоит в том, чтобы извлечь остальные целые числа и сохранить их в массиве, и я думаю, что если я смогу определить позиции пустых пространств и конца строк, это проблема также будет решена.

Как эффективно решить эту проблему [я использую Visual Studio 2017]?

Ответы [ 2 ]

2 голосов
/ 24 марта 2020

Попробуйте следующий простой экстрактор чисел на основе регулярных выражений

#include <iostream>
#include <iterator>
#include <string>
#include <regex>

int main()
{
    std::string s = "number of columns = 5\n"
        "number of rows = 345\n"
        "1 3 -5 2 9\n"
        "4 -10 34 -22 7\n";

    std::regex num_regex("\\d+|-\\d+");
    auto num_begin = 
        std::sregex_iterator(s.begin(), s.end(), num_regex);
    auto num_end = std::sregex_iterator();

    for (std::sregex_iterator i = num_begin; i != num_end; ++i) {
        std::smatch match = *i;
        std::string match_str = match.str();
        std::cout << "  " << match_str << '\n';
    }

}

Выход

  5
  345
  1
  3
  -5
  2
  9
  4
  -10
  34
  -22
  7
0 голосов
/ 24 марта 2020

Вы можете разбить строку на токены. В этом случае разбейте строку в соответствии со знаком "=", а затем попытайтесь преобразовать их в целое число http://www.cplusplus.com/reference/cstring/strtok/ Go по этой ссылке

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