首页 > 解决方案 > C++中迭代器值的垃圾值

问题描述

我正在解决一个问题,我需要返回给定字符串中的最后一个索引“1”。如果不存在则返回-1。我写了下面的简单代码,但是对于输入字符串输入“0”它失败了。我尝试使用 GDB 调试 bu,我注意到一旦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;
}

究竟是什么问题?

在此处输入图像描述 注意i第二次迭代中的值。

标签: c++string

解决方案


您的程序在这里有未定义的行为:

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

length()anstd::string具有无符号类型,并且由于您使用auto了这意味着您i也是无符号的(准确地说,是 a std::size_t)。

这样的值永远不会低于零。它们环绕到类型的最大值(一个非常大的数字!)。

所以,你的循环条件什么都不做;它总是正确的。取而代之的是,越界访问str[i]会发生,直到结果的未指定值之一恰好看起来像'1'. 然后,大量i返回。

可以通过标准容器或字符串向后循环,但您必须小心。我给你的建议是使用迭代器;在这种情况下,反向迭代器

for (auto it = str.rcbegin(); it != str.rcend(); ++it)
{
    if (*it == '1')
        return std::distance(it, str.rcend());
}

推荐阅读