输入:4
aabc
输出:引发异常
据我说,我只向cur添加了一个字符,而cur.end()将指向 在字符串结尾的char旁边,如果这样做--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())];
}
答案 0 :(得分:1)
此行
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[]
的参数。该函数接受std::size_t
,并且在语言允许的范围内,char
被隐式转换为std::size_t
。试试看:
std::cout << std::size_t{'a'} << "\n";
并修改您发布的最后一行中的索引。这是无限制的访问。