繁体   English   中英

C++中迭代器值的垃圾值

[英]Garbage value of iterator value in 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的值。

您的程序在此处具有未定义的行为:

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

std::stringlength()具有 unsigned type ,并且由于您使用了auto这意味着您的i也是无符号的(准确地说,是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());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM