反向循环崩溃

Mis*_*tyD 0 c++ c++11

所以我有这个代码,它崩溃了xcode

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

如果我这样做它工作正常,i>0但第一个字符没有打印任何有关错误的建议i>=0

眠りネ*_*ネロク 6

问题

i是类型size_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];
Run Code Online (Sandbox Code Playgroud)

推荐替代品

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

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

请注意,您还可以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});
}
Run Code Online (Sandbox Code Playgroud)

或者直接使用std::reverse_copy而不是std::copy反向迭代器:

std::reverse_copy(str.begin(), str.end(),
                  std::ostream_iterator<std::string::value_type>{std::cout});
Run Code Online (Sandbox Code Playgroud)

  • @MistyD`size_t`是无符号整数类型,何时小于0?您的编译器应该警告您这一点.如果不是,请调高警告级别. (2认同)