私は自分のgetline関数を書こうとしており、segfaultingを続けています。どのように私はそれを修正すると正式に鉱山が機能していない場合、ラインの仕事を得るのですか?私はコードを良くする方法を学ぶためにこれを書いています。回線はどのように動作しますか?
#include"MyString.h"
MyString::MyString() //constructor
{
size=0;
capacity=1;
data=new char[capacity];
}
MyString::MyString(char * n) //copy constructor
{
size=strlen(n);
capacity=strlen(n)+1;
data=new char[capacity];
strcpy(data,n);
}
MyString::MyString(const MyString &right) //
{
size=strlen(right.data);
capacity=strlen(right.data)+1;
data=new char [capacity];
strcpy(data,right.data);
}
MyString::~MyString()
{
delete [] data;
}
MyString MyString::operator = (const MyString& s)
{
if(this!=&s)
{
MyString temp=data;
delete [] data;
size=strlen(s.data);
capacity=size+1;
data= new char [capacity];
strcpy(data,s.data);
}
}
MyString& MyString::append(const MyString& s)
{
if(this!=&s)
{
strcat(data,s.data);
}
}
MyString& MyString::erase()
{
}
MyString MyString::operator + (const MyString& s)const
{
return strcat(data,s.data);
}
bool MyString::operator == (const MyString& s)
{
return strcmp(data,s.data)==0;
}
bool MyString::operator < (const MyString& s)
{
return strcmp(data,s.data)<0;
}
bool MyString::operator > (const MyString& s)
{
return strcmp(data,s.data)>0;
}
bool MyString::operator <= (const MyString& s)
{
return strcmp(data,s.data)<=0;
}
bool MyString::operator >= (const MyString& s)
{
return strcmp(data,s.data)>=0;
}
bool MyString::operator != (const MyString& s)
{
return strcmp(data,s.data)!=0;
}
void MyString::operator += (const MyString& s)
{
append(s.data);
}
char& MyString::operator [ ] (int n)
{
return data[n];
}
void MyString::getline(istream& in)
{
char c;
erase();
ifstream input;
while(in.get(c)&&c!='\n')
{
data[size]=c;
size++;
if(size+1<=capacity)
{
capacity*=2;
char*p=new char[capacity];
strcpy(p,data);
delete [] data;
data=p;
}
data[size]=c;
size++;
data[size]='\0';
}
}
int MyString::length() const
{
return strlen(data);
}
void MyString::grow()
{
capacity=strlen(data)+1;
MyString temp;
temp=data;
delete [] data;
capacity*=2;
data= new char[capacity];
}
ostream& operator<<(ostream& out, MyString& s)
{
out<<s.data;
return out;
}
// int MyString::getCapacity(){return capacity;}
:それは
const
する必要がありますので、あなたがs
変更していない:とゆうの上に文字列データをコピーするのを忘れ? –
concat/append演算子の場合、新しい文字列を保持するのに十分な大きさにデータ配列のサイズを変更する必要はありませんか? – indiv
'MyString :: MyString(char *)'はコピーコンストラクタではありません。 –