Мусорное значение итератора в C ++ - PullRequest
1 голос
/ 21 марта 2020

Я решаю проблему, когда мне нужно вернуть последний индекс '1' в данной строке. Если нет, верните -1. Я написал следующий простой код, но для ввода входной строки "0" это не удается. Я попытался отладить bu, используя GDB, и заметил, что как только l oop оператор функции index() запускается один раз, тогда мусорное значение присваивается переменной итерации i.

#include <iostream>
#include <string>
using namespace std;

int index(string &str) {
    int result = -1;
    for(auto i = str.length() - 1; i >= 0; --i) {
        if(str[i] == '1')
            return i;
    }
    return result;
}
int main() {
    int T;
    cin >> T;
    cin.ignore();
    while(T--) {
        string str;
        cin >> str;
        cout << index(str) << endl;
    }
    return 0;
}

Что именно проблема?

enter image description here Обратите внимание на значение i во второй итерации.

1 Ответ

2 голосов
/ 21 марта 2020

Ваша программа имеет неопределенное поведение:

for(auto i = str.length() - 1; i >= 0; --i) {
    if(str[i] == '1')
        return i;
}

length() для std::string имеет тип без знака , и, поскольку вы использовали auto, это означает, что i тоже без знака (точнее, a std::size_t).

Такие значения никогда go ниже нуля. Они охватывают максимальное значение типа (очень большое число!).

Итак, ваше условие l oop ничего не делает; это всегда правда Вместо этого доступ за пределы str[i] затем происходит до тех пор, пока одно из неуказанных значений, получающихся в результате, не будет выглядеть как '1'. Затем возвращается массивный i.

Можно выполнить l oop назад через стандартный контейнер или строку, но вы должны быть осторожны с этим . Я рекомендую вам использовать итераторы; в этом случае обратные итераторы .

for (auto it = str.rcbegin(); it != str.rcend(); ++it)
{
    if (*it == '1')
        return std::distance(it, str.rcend());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...