【问题标题】:C++ reverse string [closed]C ++反向字符串[关闭]
【发布时间】:2014-11-16 13:43:09
【问题描述】:

美好的一天, 请问有人可以帮忙吗?我正在尝试反转作为指针数组的成员。

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。

对不起,我还是个新手。

【问题讨论】:

  • std::reverse(_aString, _astring + length);,其中长度不包括空终止符。
  • _aString 被设置(以一种奇怪的方式)为指针c 的副本,并且可能指向已被破坏的东西或(常量)字符串文字。但是,如果没有看到 c 在创建 string 时所指的内容,我们只能猜测。尝试编写一个最小但完整的测试用例来演示问题。
  • 您需要在构造函数中分配内存并复制您传递的字符数组。不要忘记在析构函数中释放。
  • @juanchopanza,你是对的。我也认为调用函数字符串是完全不能接受的,但我没有创建赋值
  • @LeonieKruger,_aString的定义是什么?

标签: c++


【解决方案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释放内存的析构函数
  • 复制构造函数,要么被删除以防止复制,要么被实现以分配新缓冲区;
  • copy-assignment 操作符,要么被删除以防止复制,要么在必要时在调整大小后复制到现有缓冲区中。

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

【讨论】:

    猜你喜欢
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 2022-10-23
    • 2018-02-19
    相关资源
    最近更新 更多