Как вытащить все числа из строки по отдельности?

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

Из столовой на продуктовую базу поступил заказ в виде символьной строки 547) картофель : 5 кг , рис : 10 кг , сахар : 8 кг, морковь : 3 кг , свекла : 2 кг , капуста : 2 кг в которой указан номер заказа (547) и сколько кг различных продуктов требуется привезти. В символьной строке STR указана стоимость в рублях единицы каждого продукта. Например, строка STR может иметь следующий вид картофель : 20 руб. , рис : 45 руб. , сахар : 53 руб. , морковь : 28 руб. , свекла : 30 руб. , капуста : 35 руб. Составить программу для определения общей стоимости заказанных продуктов.


Ответы (1 шт):

Автор решения: Maggot

Вот накидал вам 2 примера для решения этой задачи если числе не в слепке с символами то можно сделать так - сепарируем строку - далее проверяем что это чило и вынимаем его

#include <algorithm>
#include <cctype>
#include <iostream>
#include <iterator>
#include <sstream>
#include <vector>

void foo(std::string str) {
  std::stringstream ss{str};
  std::string tmp{};
  std::vector<int64_t> data_v;

  while (ss >> tmp) {
    if (std::all_of(std::begin(tmp), std::end(tmp), [](char ch){return std::isdigit(ch);})) {
      data_v.push_back(std::stoi(tmp));
    }
  }

  for (const auto &v : data_v) {
    std::cout << v << std::endl;
  }
}

void foo2(std::string str) {
  std::stringstream ss(str);
  std::istream_iterator<std::string> begin(ss), end;
  std::vector<std::string> vec_str(begin, end);

  std::vector<int> data_v;

  auto f{[&](const std::string &s) {
    if (std::count_if(std::begin(s), std::end(s), [](char ch){return std::isdigit(ch);}) == s.size()) {
      data_v.push_back(std::atoi(s.c_str()));
    }
  }};
  std::for_each(std::begin(vec_str), std::end(vec_str), f);

  for (const auto &v : data_v) {
    std::cout << v << std::endl;
  }
}

int main() {

  std::string str{"num 10 num 20"};

  foo(str);

  foo2(str);

  return 0;
}
→ Ссылка