[英]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;
}
您的程序在此处具有未定义的行为:
for(auto i = str.length() - 1; i >= 0; --i) {
if(str[i] == '1')
return i;
}
std::string
的length()
具有 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.