Другие языки программирования и технологии

как вытащить из строки числа? с++

Пдскажите, как из строки вытащить числа? и потом преобразованные (например умноженные на 11) вставить на то же место?
Пока хочу понять, как вытащить из строки числа. Вот начала писать, но что-то не так делаю
#include
#include
#include
#include
#define N 50
using namespace std;
void process_string(string &src){

stringstream ss;
int *arr;
arr = new int[N];

for(int i; i < src().length; i++){
if(isdigit(src[i])){
int result = src[i];
ss << result;
arr = ss.src();
}

}
cout << arr;
delete[] arr;
}
int main()
{
string s = "qwe 12 r 34 uio 12000";
process_string(s);
return 0;
}
void process_string(const string &src1) {
string src = src1; // создаём копию строки, чтоб не портить исходную строку
smatch res;
regex reg("[1-9]\\d+");
while (regex_search(src, res, reg)) {
cout << "prefix='" << res.prefix() << "', str='" << res.str() << "'\n";
src = res.suffix();
}
cout << "src='" << src << "'";
}

int main() {
string s = "qwe 1245 r 34 abc";
process_string(s);
return 0;
}

В цикле поиска regex_search из строки всё время удаляется обработанная часть. Иначе regex_search работать не умеет. Поэтому результирующую строку надо собирать в другой строке. Поскольку всё равно надо создавать новую строку, лучше её вернуть как результат функции:
string process_string(const string &src1)

В моём примере выводится prefix - часть строки до найденного фрагмента, str - найденный фрагмент, и в конце выводится оставшаяся часть строки.

Другой вариант функции regex_search не требует создавать новую строку

void process_string(const string &src) {
smatch res;
regex reg("[1-9]\\d+");
auto it = src.cbegin();
while (regex_search(it, src.cend(), res, reg)) {
cout << "position='" << res.position() << "', str='" << res.str() << "'\n";
it += res.position() + res.length();
}
}
Алексей Глазов
Алексей Глазов
36 282
Лучший ответ
Мохамед Катат поняла, но этот метод не подойдет, ведь мне надо найти в строке числа, преобразовать их, и потом записать в новом виде. а здесь просто в res.str хранится результат одного и потом все равно удаляется ?
А что именно не так? Ошибка вылетает?
Что ты делаешь не так - это, как минимум:
1) код публикуешь не на pastebin

2) используешь указатели. Надо стараться не использовать их никогда. Если нужен динамический массив - бери vector. Хорошо, хоть параметр в функцию передаешь ссылкой &, а не указателем.

3) задаешь вопрос не на спецфоруме

4) не знаешь, как в принципе следует решать задачу.
Я бы, наверно, предложил сперва поделить строку по пробелу на части (google: C++ split string by space), а далее останется только пройти по всем частям, проверить парсятся ли они в числа, и если да, то добавить в vector. Но и слова тоже добавить в vector, чтобы после редактирования собрать все обратно в строку.
Но у меня не так много опыта в C++ и я сомневаюсь, что это хорошее решение. У меня есть крупный проект, где подобное сделано, но копать лень.
Зайди на спецфорум, покажи свою строку "qwe 12 r 34 uio 12000", сразу уясни что у нее нет конкретного формата (слова и числа произвольны и их порядок тоже) и что ее надо еще и обратно собрать после изменения чисел, и спроси как такое лучше делать, покидав свои\мои варианты.
Sergey Gufi
Sergey Gufi
5 149