C ++反向字符串

时间:2014-09-22 14:33:02

标签: c++

美好的一天, 请有人帮忙吗?我试图反转一个指针数组成员。

string::string(char *c)
{
    int i =0;
    while ((c[i] != '\0'))
    {
        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。

对不起,我还是个新手。

1 个答案:

答案 0 :(得分:1)

问题是

_aString=*&c;

这是一种奇怪的写作方式

_aString=c;

这样_aString只是指向函数参数;这个类不管理字符串的内存(如std::string那样),但是指的是在别处管理的外部字符串。

在您的测试用例中,该字符串是一个字符串文字 - 不可修改。因此,尝试修改它,就像reverse那样,会给出未定义的行为;如果你很幸运,违反访问权限;如果你运气不好,数据损坏或其他一些不必要的运行时行为。

如果你的类应该管理内存,那么它需要在构造函数中分配它。假设这个赋值是内存管理的练习(否则,只需使用std::string),你需要像

这样的东西。
_aString = new char[_lenght];
std::copy(c, c+_lenght, _aString);

并且不要忘记Rule of Three

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

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