反向循环崩溃

时间:2018-01-27 07:38:24

标签: 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的错误的任何建议吗?

3 个答案:

答案 0 :(得分:6)

问题

i属于size_t类型(它是无符号整数),因此当i为零且执行i--时,其值会回绕< / em>,获得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::cout的{​​{3}}对象结合使用:

#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::ostream_iterator代替std::copy,因此不需要反向迭代器:

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

答案 1 :(得分:2)

最好使用std::reverse以惯用的,无索引的方式执行此操作。

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

int main() {
    std::string str = "Hello World!";
    std::reverse(str.begin(), str.end());
    std::cout << str << "\n"; // !dlroW olleH
}

答案 2 :(得分:0)

由于c ++中的字符串是零 - 字符串中的第一个字符是str [0] - 因此c ++字符串中最后一个字符的索引始终是str.length() - 1或str.size() -1 所以它应该是

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