C++反向字符串

C++ reverse string

本文关键字:字符串 C++      更新时间:2023-10-16

您好,请有人帮忙好吗?我正在尝试反转一个指针数组成员。

string::string(char *c)
{
    int i =0;
    while ((c[i] != ''))
    {
        i++;
    }
    _lenght= i;
    _aString=*&c;
}
void string::reverse() //Requirements specify to have this argument
{
          for(int i=0; i<_lenght/2; i++)
    {
        std::swap(_aString[i], _aString[_lenght-i-1]);
    }
}

我在这方面遇到运行时错误。

这是我的主要功能

   int main(){
       string a;
       std::cout << "a is " << a << "n";
       string b("12345");
       string c("12345",3);
       std::cout << "c is " << c << "n";
       c = a;
        a = b;
       std::cout << "a is " << a << "n";
       b.reverse();
       std::cout << "a is " << a << "n";
       return 0;
   }

我得到的错误是

UnisaLesson1.exe中0x00fd6710处未处理的异常:0xC0000005:写入位置0x00fdfd08时发生访问冲突。

对不起,我还是个新手。

问题是

_aString=*&c;

这是一种奇怪的书写方式

_aString=c;

使得CCD_ 1简单地指向函数自变量是什么;这个类不管理字符串的内存(就像std::string那样),而是引用在其他地方管理的外部字符串。

在您的测试用例中,该字符串是一个字符串文字,它是不可修改的。因此,像reverse那样试图修改它,会产生未定义的行为;如果幸运的话,访问违规;如果运气不好,可能是数据损坏或其他一些不需要的运行时行为。

如果您的类应该管理内存,那么它将需要在构造函数中分配内存。假设这个任务是内存管理中的一个练习(否则,只使用std::string),您可能想要类似的东西

_aString = new char[_lenght];
std::copy(c, c+_lenght, _aString);

别忘了三条规则:

  • delete [] _aString释放内存的析构函数
  • 复制构造函数,要么删除以防止复制,要么实现以分配新的缓冲区
  • 复制分配运算符,删除以防止复制,或者实现为在必要时调整大小后复制到现有缓冲区

您还可以考虑将_lenght的拼写修改为_length