gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:19:38 24 4
gpt4 key购买 nike

我正在解决一个需要在给定字符串中返回最后一个索引“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;
}

到底是什么问题?

enter image description here
注意第二次迭代中 i的值。

最佳答案

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

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

The length() of an std::string has an unsigned type,并且由于您使用了 auto,这也意味着您的 i也未签名(确切地说,是 std::size_t)。

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

因此,您的循环条件什么也不做;总是如此。取而代之的是,越界访问 str[i],直到结果产生的未指定值之一恰好类似于 '1'为止。然后,返回大量的 i

可以通过标准容器或字符串 you have to be careful about it向后循环。我对您的建议是使用迭代器。在这种情况下,为 reverse iterators
for (auto it = str.rcbegin(); it != str.rcend(); ++it)
{
if (*it == '1')
return std::distance(it, str.rcend());
}

关于c++ - C++中迭代器值的垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60789930/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com