#include"wz.h"
#include"sts.h"
class _string
{
friend std::istream& operator>>(std::istream& is, _string& a);//bug 1 2
friend std::ostream& operator<<(std::ostream& os,_string& a);
public:
_string() //默认构造函数
{
length = 0;
b=new char[1];
b[0]=‘\0‘;
}
_string(char *a); //构造函数
_string(int n,char a);
~_string(); //析构函数
_string(_string &a); //复制构造函数
int size(){return length;} //获得字符串长度
_string operator+(const _string& a); //重载‘+‘操作符
_string& operator+=(const _string& a); //重载‘+=‘操作符
_string& operator=(const _string& a); //重载赋值操作符
int operator<(const _string &a);
int operator>(const _string &a);
char& operator[]( int n); //重载下标操作符
_string substr(int pos,int n); //返回子字符串
_string substr(int pos); //返回子字符串
private:
char *b;
int length;
};
_string::_string(char *a) //构造函数
{
length = strlen(a);
b = new char[length+1];
for(int i= 0;i<length;i++)
{
b[i] = a[i];
}
b[length] = ‘\0‘;
}
_string::_string(int n,char a)
{
b=new char[n+1];
for(int i= 0;i<n;i++)
{
b[i] =a;
}
b[n] = ‘\0‘;
}
_string::~_string() //析构函数
{
delete []b;
length=0;
}
_string::_string(_string &a) //复制构造函数
{
length=a.size();
b=new char [length+1];
for(int i = 0;i<length;i++)
{
b[i] = a.b[i];
}
b[length] = ‘\0‘;
}
_string _string::operator+(const _string& a) //重载+
{
int newLen = length+a.length;
char *str;
str = new char[newLen+1];
int count = 0;
for(int i = 0;i<length;i++)
{
str[i] = this->b[i];
count++;
}
for(int i =0;count<newLen;count++,i++)
{
str[i] = a.b[i];
}
str[newLen] = ‘\0‘;
_string temp(str);
return temp;
}
_string& _string:: operator+=(const _string& a) //重载+=
{
int newLen = length+a.length;
char *str;
str = new char[newLen+1];
int count = 0;
for(int i = 0;i<length;i++)
{
str[i] = this->b[i];
count++;
}
for(int i =0;count<newLen;count++,i++)
{
str[i] = a.b[i];
}
str[newLen] = ‘\0‘;
_string temp(str);
*this=temp;
return *this;
}
_string& _string:: operator=(const _string &a) //重载=
{
if(this==&a)
return *this;
delete []b;
length = a.length;
b = new char[length+1];
for(int i = 0;i<length;i++)
{
b[i] = a.b[i];
}
b[length] = ‘\0‘;
return *this;
}
int _string:: operator<(const _string &a)
{
while (*this->b == *a.b)
{
if (*this->b == ‘?‘)
{
return 0;
}
this->b++;
b++;
}
if (*this->b - *a.b < 0)
{
return 1;
}
else return 0;;
}
int _string:: operator>(const _string &a)
{
while (*this->b == *a.b)
{
if (*this->b == ‘?‘)
{
return 0;
}
this->b++;
b++;
}
if (*this->b - *a.b >0)
{
return 1;
}
else return 0;;
}
char& _string:: operator[]( int n) //重载下标操作符
{
if(n>length)
return b[length-1];
else
return b[n];
}
ostream& operator<<(ostream& os, _string& a) //重载输出符
{
os<<a.b<<endl;
return os;
}
/*
istream& operator>>(std::istream& is, _string& a) //重载输入符
{ // 1 while(*a.b!=‘\0‘)
// {is>>a.b ;}
//2 a.b=new char[256];
is>>a.b ;
a.length=strlen(a.b);
return is;
}
*/
// 5
istream& operator>>(istream &is, _string &str)//输入
{
char tem[1000]; //简单的申请一块内存
is.get(tem,1000,‘\n‘);
str.length = strlen(tem);
str.b = new char[str.length + 1];
strcpy(str.b, tem);
return is;
}
_string _string::substr(int pos, int n) //两个接受不同参数的substr函数,返回子字符串
{
char *p = new char[n+1];
for(int i=0;i<n;i++)
{
p[i]=b[pos];
pos++;
}
p[n]=‘\0‘;
_string k(p);
k.length=n;
return k;
}
_string _string::substr(int pos)
{
int len=length;
char *p=new char[len-pos+1];
int t=pos;
for(int i=0;t<len;t++,i++)
{
p[i]=b[t];
}
p[t]=‘\0‘;
_string k(p);
k.length=len-pos;
return k;
}
int main (){;
_string a;
cin>>a;
cout<<a;
return 0;
return 0;}为了输入能 带空格 但是 这里可能有bug即失去第一个字符
原文:http://sts609.blog.51cto.com/11227442/1758675