Как вытащить все числа из строки по отдельности?
Понимаю, что нужно использовать функцию atoi. Но не понимаю как провернуть, чтобы она мне вытащила все числа из строки, ведь если в строке встречаются символы, отличные от цифр, то преобразование происходит до ближайшего символа, отличного от цифры.
Из столовой на продуктовую базу поступил заказ в виде символьной строки 547) картофель : 5 кг , рис : 10 кг , сахар : 8 кг, морковь : 3 кг , свекла : 2 кг , капуста : 2 кг в которой указан номер заказа (547) и сколько кг различных продуктов требуется привезти. В символьной строке STR указана стоимость в рублях единицы каждого продукта. Например, строка STR может иметь следующий вид картофель : 20 руб. , рис : 45 руб. , сахар : 53 руб. , морковь : 28 руб. , свекла : 30 руб. , капуста : 35 руб. Составить программу для определения общей стоимости заказанных продуктов.
Ответы (1 шт):
Вот накидал вам 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;
}