QtC++ QVector Ошибка

void Line::RemoveSpaces()
{
// Цикл по всем "компонентам" строки
    for (int i = 0; i < _line.size(); ++i)
    {
        while (true)
        {
            if (_line[i][0] == ' ' || _line[i][0] == '\n' || _line[i][0] == '\t')
            {
                _line[i].remove(0, 1); // Вот эта строчка
            }
            else
            {
                break;
            }
        }

        for (int j = _line[i].length() - 1; j > 0; --j)
        {
            if (_line[i][j] == ' ' || _line[i][j] == '\n' || _line[i][j] == '\t')
            {
                _line[i].remove(j, 1);
            }
            else
            {
                break;
            }
        }

        if (_line[i] == "")
        {
            _line.erase(_line.begin() + i);
        }
    }
}

_line - это QVector<QString>

До вызова функции RemoveSpaces - _line равна:

{"class", " jopa ", "{", " ", "int", " main", "(", "\t", ")", "\t", "{", "\n", "}", "\n\n\n\t\t  ", "}", "\n\n"}

Ожидаемый результат после:

{"class", "jopa", "{", "int", "main", "(", ")", "{", "}", "}"}

Ожидания оправдали надежды. Результат верный. Но в консоль выводится следующие:
Using QCharRef with an index pointing outside the valid range of a QString. The corresponding behavior is deprecated, and will be changed in a future version of Qt.

Причем много раз. При отладке я заметил, что первый раз выводится когда на "Вот этой строчке(в коде есть комментарий)" i равна 4. И _line[i] равна " main"

Что означает эта надпись и как от неё избавится?


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

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

Давайте посмотрим на этот код детальнее

 while (true)
    {
        if (_line[i][0] == ' ' || _line[i][0] == '\n' || _line[i][0] == '\t')
        {
            _line[i].remove(0, 1); // Вот эта строчка
        }
        else
        {
            break;
        }
    }

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

while (!_line[i].isEmpty())
→ Ссылка
Автор решения: magrif

А лучше выбросить этот код и написать что-то такое :)

QStringList _line = {"class", " jopa ", "{", " ", "int", " main", "(", "\t", ")", "\t", "{", "\n", "}", "\n\n\n\t\t  ", "}", "\n\n"};
for(auto& str : _line) {
    str = str.simplified();
}
_line.removeAll(QString{});
→ Ссылка