正在访问字符串的迭代器(显示未定义的行为)

时间:2019-06-07 10:22:33

标签: c++ string iterator

输入: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())];

}

1 个答案:

答案 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";

并修改您发布的最后一行中的索引。这是无限制的访问。