c++ - 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;
}
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());
}
推荐阅读
- pandas - 将两个 Pandas 列转换为 yyyy-mm-dd HH:MM:SS
- javascript - 清理代码的最佳方法是什么?
- android - 获取主屏幕小部件元素的尺寸
- electron - 如何在电子中使用本地存储
- python - 第一篇关于 instagram 配置文件的 xpath 不起作用(python、selenium、chromedriver)
- julia - CartesianIndex 操作
- python - 在日期时间重新采样并计算平均值
- scala - 使用 Spark/scala 将字符串转换为 DataFrame
- c - 在C中打印数组的总和
- rust - 如何创建 Vec
在哪里 T: Into<_> 在 Rust 中?