尽管使用C ++检查,迭代器也会超出界限

时间:2018-04-29 22:32:23

标签: c++

我有一个功能可以反转字符串中的单词,例如"嗨,Sam"它会将一个字符串反转为" Sam在那里嗨"。
它通过反转一个字符串,然后反转单词来实现 但是在完成之后,我在线路上遇到了一个段故障 我怀疑迭代器试图在有效范围之外取消引用 但它首先检查范围,所以如果它无效,它将立即退出。
我哪里错了?

void rev(string& str) {
    std::reverse(str.begin(), str.end());
    auto bIter = str.begin();
    auto eIter = str.begin();

    while (eIter != str.end()) {
        for (;eIter != str.end() && (*eIter) != ' '; eIter++) {}
        std::reverse(bIter, eIter);
        bIter = ++eIter;
    }
}

2 个答案:

答案 0 :(得分:6)

当内部for循环结束时eIter == str.end()时,由于while循环的最后一行(str.end()),它超出了++eIter

添加break解决了这个问题。

void rev(string& str) {
    std::reverse(str.begin(), str.end());
    auto bIter = str.begin();
    auto eIter = str.begin();

    while (eIter != str.end()) {
        for (;eIter != str.end() && (*eIter) != ' '; eIter++) {}
        std::reverse(bIter, eIter);
        if (eIter == str.end()) break; // HERE
        bIter = ++eIter;
    }
}

答案 1 :(得分:0)

您的问题是,即使是eIter,您也会增加str.end()

正如您已经使用std,您可以通过std::find转换您的循环:

void rev(std::string& str) {
    std::reverse(str.begin(), str.end());

    for (auto it = str.begin(); it != str.end(); ) {
        auto endWordIt = std::find(it, str.end(), ' ');
        std::reverse(it, endWordIt);
        it = (endWordIt == str.end()) ? str.end() : (endWordIt + 1);
    }
}