Итератор изменяет свое значения

206
28 августа 2021, 13:30

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

string str = "9 8 7 6 5 4 3 2 1";
int *arr =  new int;
string :: const_iterator it = str.begin();
// Если тут вывести (*it) то результатом будет 9
int i = 0;
for (; it != str.end(); ++it)
{
    if (isdigit(*it))
    {
        arr[i] = *it;
        i++;
    }
}

Как видно из комментария , на его месте разыменованный итератор возвращает 9 , ОДНАКО , когда итератор попадает в цикл , то : 1) в первый раз он проходит проверку isdigit(*it) и попадает дальше 2) в arr[0] по какой-то причине записываться не 9 , а 49 и с другими цифрами то же самое - их значение увеличивается.Функция stoi(*it) почему-то отказывается работать .

Answer 1
#include <iostream>
constexpr int DESIRABLE_VALUE = 100;
int main()
{
    std::string str = "9 8 7 6 5 4 3 2 1";
    int *arr = new int[DESIRABLE_VALUE];
    auto it = str.begin();
    int i = 0;
    for (; it != str.end(); ++it)
    {
        if (isdigit(*it))
        {
            arr[i] = *it - 48;
            i++;
        }
    }
    for(auto i = 0; i < 9; i++)
    {
        std::cout << arr[i];
    }
    delete[] arr;
}

-48, чтобы перевести из ascii, т.к. в итератор итерирует по строке получая чары (а конкретно вы получаете номер числа в ascii таблице, то есть числу 9 будет соответствовать 57 И соответственно вы не выделили под ваш arr память с помощью оператора [], в котором нужно было указать, сколько элементов соответствуещего типа будет в вашем динамическом массиве.
Вместо constexpr int DESIRABLE_VALUE = 100; вы можете сперва пройтись по массиву строк посчитав, сколько чисел в нем находится, чтобы позже выяснить, сколько памяти потребуется вашему arr для дальнейшей работы с полученными из строки числами.

READ ALSO
C++ - Создание типа конкретного размера

C++ - Создание типа конкретного размера

У меня есть необходимость хранить значение цвета в формате 0xAARRGGBB, то есть, нужен тип, занимающий 4 байтаЯ использую unsigned int, но, насколько знаю,...

253
ошибка, связанная с gets() c++

ошибка, связанная с gets() c++

решаю задачу на coderbyte, там массив читается так:

94
Выход из масива | Помогите пожалуйста

Выход из масива | Помогите пожалуйста

ПриветТакая проблема, что после строчки int coc=0; Цикл с вложенным, там xPtr выходит за рамки, не понимаю почему, можете помочь пожалуйста решить...

112
Не выполняется сложение с float

Не выполняется сложение с float

Я выполняю сложение float + floatМне надо в цикле прибавить к массиву типа float значение переменной Eps=0

102