【问题标题】:Overloading * operator for string in C++ [closed]在 C++ 中为字符串重载 * 运算符 [关闭]
【发布时间】:2014-07-06 14:22:43
【问题描述】:

我需要使用此 (*) 运算符将字符串乘以 X 次。例如:

 String a = "First";
 String b = a*2; // then b = "FirstFirst"

但它崩溃了。最奇怪的是,它时不时地崩溃。几次它工作,然后崩溃。

所以这是我的字符串类:

    class String {
      int len;
      char *str;
    public:
      String () {
      len = 0;
      str = NULL;
      }
      String(const char *);
      String(const String &);
      ~String() {
      delete [] str;
      }
      String operator++(int notused);
      String & operator =(const String &); 
      friend int operator == (const String &, const String &); 
      friend ostream & operator <<(ostream &, const String &);
      friend istream & operator >>(istream &, const String &);
      friend String operator*(const String & s1, int x);
      friend String operator*(int x, const String & s1);
    };

这里是 * 运算符和一些构造函数的重载:

      String::String(const char * ptr)
      {
       str = new char [(len = strlen(ptr)) + 1];
       strcpy(str, ptr);
      }

      String::String(const String & s)
      {
       str = NULL;
       if(len = s.len){
       str = new char [len + 1];
       strcpy(str, s.str);
       }
      }
      String operator*(const String & s1, int x)
      {
         String result = s1;
         result.str = new char[(s1.len)*x];
         strcpy (result.str, s1.str);
         result.len = x*s1.len;;
         for (int i = 0; i < (x-1); i++)
         {
           strcat (result.str, s1.str);
         }
         return result;
      }

首先我检查了字符串的长度。但他们还好(我认为),那有什么问题呢?

所以,我用以下几行分配了新内存:

    String result = s1;
    result.str = new char[(s1.len)*x];

它适用于从 0 到 7 的数字。在 8 时它会崩溃。一切都与大小有关。如果我乘双 X 倍:

result.str = new char[(s1.len)*x*x];

然后我就可以跨越 8 道关卡了。有时我会看到 bad_alloc 错误。

【问题讨论】:

  • 你试过使用调试器吗?
  • “但他们还好(我认为)” - 为什么是“我认为”?您的调试器会告诉您所有相关信息,因此您不必怀疑自己的想法。
  • 目前我正在阅读如何使用它们,但我想,这可能是有人有类似的问题,所以我发布了这个问题。

标签: c++ string memory operator-overloading


【解决方案1】:

问题是因为你没有在operator*中分配新内存

strcpystrcat 假设 char 数组足够大以包含结果字符串。

您应该分配足够的内存,以便在构造函数中完成。

【讨论】:

  • 问题从strcpy开始。
  • 是的。分配新内存。它有帮助。谢谢你。我只需要了解如何有效地实现代码分配。
猜你喜欢
  • 2019-05-12
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
  • 2015-11-12
相关资源
最近更新 更多