c++ - 反向 For 循环崩溃

标签 c++ c++11

所以我有这段代码,它使 xcode 崩溃

void strrev(const std::string& str)
{
    for(size_t i=str.length();i>=0;i--)
    {
        std::cout << str[i];
    }
}

如果我执行 i>0 它工作正常但是第一个字符不会被打印 关于 i>=0 有什么问题有什么建议吗?

最佳答案

问题

isize_t 类型(它是一个无符号整数),所以当 i 为零且 i-- 被执行,它的值环绕,使 i 成为它可以存储的最高可能值。此 i 然后用于表达式 str[i] 导致崩溃。

解决方案

您可以单独处理 i 为零的情况。此外,由于索引从零开始,因此可能的最高索引是 str.length()-1。 那么应该是:

for(size_t i=str.length()-1; i > 0; i--)
    std::cout << str[i];
std::cout << str[0];

推荐的备选方案

考虑使用反向迭代器来避免必须处理索引:

void strrev(const std::string& str)
{
    for (auto rit = str.rbegin(); rit != str.rend(); ++rit)
        std::cout << *rit;
}

请注意,您也可以使用 std::copy结合反向迭代器和 std::ostream_iterator std::cout 的对象:

#include <iostream>
#include <algorithm>
#include <string>
#include <iterator>

void strrev(const std::string& str)
{
   std::copy(str.rbegin(), str.rend(),
             std::ostream_iterator<std::string::value_type>{std::cout});
}

或者直接使用std::reverse_copy而不是 std::copy,因此不需要反向迭代器:

std::reverse_copy(str.begin(), str.end(),
                  std::ostream_iterator<std::string::value_type>{std::cout});

关于c++ - 反向 For 循环崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48473690/

相关文章:

c++ - 迁移到 C++11 时出现不等式比较结果未使用警告

c++ - 在不创建参数对象的情况下解析 constexpr 函数

c++ - 将来是否有机会使用 C++ 开发 Web 应用程序?

c++ - 是否可以在不编写复制构造函数的情况下在 main 中的构造函数之间进行选择?

c++ - 尝试使用 Redispp 在类中设置全局 Redis 连接

c++ - 如何使用 QHttp 进行压缩?

c++ - 表达式树的现代 C++ 版本 https ://gist. github.com/2934374

c++ - std::shared_ptr 为空但不为 null

c++ - 在 lambda 表达式中使用外部函数

c++ - Operator[] 重载返回错误数据