c++ - 访问迭代器到字符串(显示未定义的行为)
问题描述
输入:4
aabc
输出:抛出异常
根据我的说法,我只向 cur 添加了一个字符,cur.end() 将指向字符串结尾的字符旁边,如果我这样做 --cur.end() 那么为什么我不能访问那个?
#include<iostream>
#include<string>
using namespace std;
int main() {
int n;
string s;
cin >> n >> s;
string cur;
int i = 1;
cur += s[0];
cout << cur[*(--cur.end())];
}
解决方案
这条线
cout << cur[*(--cur.end())];
是邪恶而复杂的。使用您发布的输入,cur
保存一个字符
cur += s[0];
原样s
,"aabc"
然后将第一个添加char
到cur
. 然后,--cur.end()
(应该由std::prev(cur.end())
或cur.crbegin()
无论如何替换)是 的第一个字符的迭代器cur
,即a
. 因此,对迭代器进行引用会产生a
,然后将其用作 的参数std::string::operator[]
。此函数接受 a std::size_t
,并且在语言允许的情况下,char
隐式转换为 a std::size_t
。试试这个:
std::cout << std::size_t{'a'} << "\n";
并修改您发布的最后一行中的索引。这是一个越界访问。
推荐阅读
- android - 为什么在切换到新主题后仍然使用 android:background 的值
- java - Android 连接到远程服务器上的数据库时出错
- java - 无法在 Cygwin 上找到有效的 Java 版本
- c# - Java.Lang.NoClassDefFoundError:超时获取异常详细信息 Xamarin Android
- ios - 如何将字典数组附加到另一个数组
- c# - 自定义 JSON 转换器,以帮助反序列化回确切原始类型的对象
- java - Eclipse:带有静态前端的动态 Web 项目
- javascript - 在javascript中从json中提取值
- php - 在 MySQL LIKE 子句中使用具有多个值的变量
- hadoop - Apache Nutch 2.3.1,增加reducer内存