首页 > 解决方案 > 访问迭代器到字符串(显示未定义的行为)

问题描述

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

}

标签: c++stringiterator

解决方案


这条线

cout << cur[*(--cur.end())];

是邪恶而复杂的。使用您发布的输入,cur保存一个字符

cur += s[0];

原样s"aabc"然后将第一个添加charcur. 然后,--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";

并修改您发布的最后一行中的索引。这是一个越界访问。


推荐阅读