C ++程序在旋转字符串时崩溃超过它的长度

时间:2013-08-21 11:19:33

标签: c++ string rotation

string half_password = password.str();
    if(shift < 0) //left shift
        rotate(half_password.begin(), half_password.begin() + (-1*shift), half_password.end());
    if(shift > 0) //right shift
        rotate(half_password.rbegin(), half_password.rbegin() + shift, half_password.rend());

现在,如果| shift | &GT; 7 half_password的长度为8,然后我的程序崩溃并出现分段错误。我的问题是rotate函数不允许旋转超过字符串的最高索引吗?

我对此没有问题,逻辑运行正常。我想知道这是rotate函数的工作原理。

3 个答案:

答案 0 :(得分:2)

来自cppreference.com

  

此函数的前提条件是[first,n_first]和[n_first,last)是有效范围。

当您超出最高索引大小或低于最低索引大小时,这些都不是有效范围。

答案 1 :(得分:1)

std::rotate的第二个参数是一个迭代器,它指向你想要在字符串开头的元素,并说它很容易理解给它一个元素的迭代器通过容器的结束/开始将导致崩溃。

您可以使用模数运算符 %来解决此问题,以限制将shift添加到始终位于0之间的结果而不是容器的长度。


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

std::string
shift_it (std::string const& src, int shift)
{
  std::string dst = src;

  if (shift < 0)
    std::rotate (dst.begin  (), dst.begin  () + (+shift % dst.size ()), dst.end  ());
  else
    std::rotate (dst.rbegin (), dst.rbegin () + (-shift % dst.size ()), dst.rend ());

  return dst;
}

int
main (int argc, char *argv[])
{
  std::cerr << shift_it ("hello", 7) << std::endl;
  std::cerr << shift_it ("hello", 2) << std::endl;

  std::cerr << shift_it ("hello", -7) << std::endl;
  std::cerr << shift_it ("hello", -2) << std::endl;
}

输出:

lohel
lohel
llohe
llohe

答案 2 :(得分:1)

第二个参数是 middle ,所以它应该位于开头和结尾之间。做一个<middle value> % (end() - begin())以确保这一点。