【问题标题】:How to new a dynamic array after cin如何在cin之后新建一个动态数组
【发布时间】:2023-04-06 08:51:01
【问题描述】:

我正在尝试创建一个包含指针的类,它是动态数组的核心。 如何重载运算符 >> 这样我就可以在不知道要放置多少个字符的情况下将 cin >> 指向指针? 我正在尝试:

#include <iostream>
class MyString
{
private:
    char* str;
    size_t length;

public:
    //some code here

    friend std::istream& operator>>(std::istream& is, const MyString& other)
    {
        is >> other.str;
        return is;
    }
}

这发生在我尝试 cin 字符串时: HEAP CORRUPTION DETECTED

有没有办法读取字符串,将其分配给我的字符串,并且不使用 std::string 标头? (我试图创建一个不依赖于 std::string 的字符串类)

【问题讨论】:

  • 一个简单的实现会使用is.get() 一次检索一个字符,并将其附加到str,如果需要调整大小。当然,当std::isspace(chr) 为真时停止。为此,您需要动态分配内存并跟踪您正在使用/有多少可用空间。
  • 您的类中的str 成员需要初始化,以便在读取之前指向某个对象(例如动态分配的内存)(例如is &gt;&gt; other.str)。如图所示,str 未初始化,因此is &gt;&gt; other.str 给出未定义的行为。通常,用于初始化目的的动态内存分配是在构造函数中完成的 - 如果需要调整动态分配的内存大小,则有必要编写以下代码:(1) 分配新内存块 (2) 将数据从旧内存块复制到新内存块 (3) 释放旧内存块。
  • 还要注意指针不是数组。成员 str 是一个指针,并且该指针未初始化(因此没有特别指向任何东西)。如果您想编写模拟数组的代码,一个关键的考虑因素是要了解指针和数组之间存在非常真实的差异(即使它们可以在某些上下文中互换使用,它们也不是一回事,所以不是总是可以互换的)。

标签: c++ operator-overloading cin dynamic-arrays istream


【解决方案1】:

一个简单的实现会使用is.get() 一次检索一个字符,并将其附加到other,如果需要,可以调整大小。当然,当std::isspace(chr) 为真时停止。为此,您需要动态分配内存并跟踪在MyString 的实现中您正在使用/拥有多少可用空间。

这是它的骨架;你可能需要实现append() 方法。

friend std::istream& operator>>(std::istream& is, MyString& other) {
   while (true) {
      int chr = is.get();
      if (is.eof() || std::isspace(chr)) {
          break;
      }
      other.append((char)chr);
   }
   return is;
}

【讨论】:

    【解决方案2】:
    #include <iostream>
    #include <string.h>
    class MyString
    {
    private:
        size_t length;
        char* str;
        void getInput(std::istream&is)
        {
          char c='\0';
    
          while(c!='\n')
          {
            is.get(c);
             length++;
            str=(char*)realloc(str, length);
            
            if(c=='\n')
            {
            str[length-1]='\0';
            }
            else{
              str[length-1]=c;
            }
          }
        }
    
    public:
        MyString()
        {
          length=0;
          str=new char[1];
          str[0]='\0';
        }
        //some code here
        friend std::istream& operator>>(std::istream& is,  MyString& other)
        {
            std::cout<<"Enter String: ";
            other.getInput(is);
            return is;
        }
    
        void printString()
        {
          std::cout<<str<<std::endl;
        }
    
        ~MyString()
        {
          delete[]str;
          length=0;
        }
    };
    
    int main()
    {
      MyString s;
      std::cin>>s;
    
      s.printString();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多