Ваша программа имеет неопределенное поведение:
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());
}