重载>>用户定义的字符串类的运算符

时间:2012-05-25 07:35:12

标签: c++ operator-keyword

问题

问题是我正在尝试使用插入运算符获取用户输入并初始化值thechars,将大小分配给我需要输入长度,我如何得到它?并在插入运算符中初始化。

主要问题在于插入操作符。

当我运行程序时,它会显示分段错误,

plz help

class string1
{    
  private:
    int len;
    char *thechars;

    //friend ostream& operator<<(ostream&,string1&);##
    //friend istream& operator>>(istream&,string1&);##

  public:
    //string1() :len(0),thechars(NULL){}
    string1()
    {
      thechars = new char[1];
      thechars[0] = '\0';
      len=0;
      // cout << "\tDefault string constructor\n";
      // ConstructorCount++;
    }
};

// this is the insertion operator i use
istream& operator>>(istream& in, string1& tpr)
{
  in >> tpr.thechars;
  //tpr.thechars[i+1]='\0';
  return in;
}

//this one is the extraction operator
ostream& operator<<(ostream& out,string1& prt)
{
  for(int i=0;i<prt.len;i++)
    out<<prt.thechars[i];

  return out;
}

// main function##
string1 str;
cout << "enter first string" << endl;
cin >> str;
cout << str << endl;

3 个答案:

答案 0 :(得分:2)

如果in是文件输入流,您可以执行以下操作:

in.seekg(0, ios::end);
length = in.tellg();
in.seekg(0, ios::beg);

另一个选项是按char读取输入流char,每次耗尽时加倍thechars的大小。首先,引入另一个变量来存储当前分配的缓冲区大小--- allocSize。之后更新构造函数和operator<<,如下所示。

构造

string1()
{
    allocSize = 1; // initially allocated size
    thechars = new char[allocSize];
    thechars[0] = '\0';
    len=0;
}

输入操作员:

istream& operator>>(istream& in, string1& tpr)
{
    char inp;
    while (in.get(inp)) {
        // end-of-input delimiter (change according to your needs)
        if (inp == ' ')
            break;
        // if buffer is exhausted, reallocate it twice as large
        if (tpr.len == tpr.allocSize - 1) {
            tpr.allocSize *= 2;
            char *newchars = new char[tpr.allocSize];
            strcpy(newchars, tpr.thechars);
            delete[] tpr.thechars;
            tpr.thechars = newchars;
        }
        // store input char
        tpr.thechars[tpr.len++] = inp;
        tpr.thechars[tpr.len] = '\0';
    }
}

但最好的选择是使用std::string作为thechars的类型。你真的需要所有这些手动内存处理吗?

答案 1 :(得分:1)

而不是给in char*赋予它一个常规字符串。然后你可以自己提取数据。

istream& operator>>(istream& in, string1& tpr)
{
  string temp;
  in >> temp;
  tpr.len = temp.length + 1;
  tpr.thechars = new char[tpr.len];
  tpr.thechars[temp.length] = '\0';
  strcpy(tpr.thechars, &temp[0], tpr.len);
  return in;
}

答案 2 :(得分:0)

你写了

 in>> tpr.thechars; // where thechars="\0"; 

你只分配了一个字节,但我猜你是带有更多字节的输入字符串。 我认为这里有错误。