我为你死了2次了!

完成String类、操作符重载(+、=、>>、<<、[]、>) 、length函数、find函数;

悬赏分:0 | 解决时间:2009-10-14 07:09 | 提问者:yanyichen0
最佳答案
//MyString.h
#ifndef STRING_NEW
#define STRING_NEW
#include <iostream>
using namespace std;

class String
{
private:
char *ptr;
int m_leng;
public:
String(); //构造函数
String(char *s);
String(String& str1); //拷贝构造函数
~String(); //析构函数
String operator+(String& str1); //连接
void operator=(String& str1); //比较
bool operator>(String& str1); //比较大小
char operator[](int i); //下标运算符
friend istream& operator>>(istream& in, String& str1); //输入流
friend ostream& operator<<(ostream& out,String& str1); //输出流
int length(); //计算长度
int find(String& str1); //查找位置
};

#endif


#include "stdafx.h"
#include "string.h"
#include "MyString.h"
using namespace std;

int Min(int x,int y) //取较小者
{
return x<=y?x:y;
}

String::String() //空构造函数
{
ptr=new char[1];
*(ptr+0)='/0';
m_leng=0;
}

String::String(char *s) //构造函数
{
if(ptr!=NULL)
{
ptr=new char[strlen(s)+1];
for(int i=0;i<strlen(s);i++)
*(ptr+i)=*(s+i);
*(ptr+strlen(s))='/0';
}
else
*(ptr+0)='/0';
m_leng=strlen(s);
}

String::String(String& str1) //拷贝构造函数
{
if(str1.ptr!=NULL)
{
ptr=new char[strlen(str1.ptr)+1];
for(int i=0;i<strlen(str1.ptr);i++)
*(ptr+i)=*(str1.ptr+i);
}
else
*(ptr+0)='/0';
m_leng=str1.length();
}

String::~String() //析构函数
{
if(ptr!=NULL)
delete[] ptr;
}

int String::length() //求长度
{
m_leng=0;
while(*(ptr+m_leng)!='/0')
m_leng++;
return m_leng;
}

String String::operator+(String& str1) //连接
{
int len=m_leng+str1.length();
char *temp=new char[len+1];
for(int i=0;i<m_leng;i++)
{
*(temp+i)=*(ptr+i);
}
for(int i=m_leng,j=0;j<str1.length();i++,j++)
{
*(temp+i)=*(str1.ptr+j);
}
*(temp+len)='/0';
String newstring(temp);
delete[] temp; //指针释放
return newstring;
}

void String::operator=(String& str1) //赋值
{
if(ptr!=NULL)
delete[] ptr; //清空
ptr=new char[str1.m_leng+1];
for(int i=0;i<str1.m_leng+1;i++)
*(ptr+i)=*(str1.ptr+i);
ptr[str1.m_leng]='/0';
/* str1.m_leng=str1.length();*/
}

bool String::operator >(String& str1) //比较
{
int n1,n2;
n1=m_leng;
n2=str1.length();
bool lager(false);
for(int i=0;i<=Min(n1,n2);i++) //取短的
{
if(*(ptr+i)>*(str1.ptr+i)) //字符大的话就结束
{
lager=true; //返回true
break;
}
if(*(ptr+i)<*(str1.ptr+i)) //小的话结束
{
break;
}
if(*(ptr+i)==*(str1.ptr+i)) //相等的话继续
{
continue;
}
}
return lager;
}

char String::operator[](int i) //下标
{
int len=m_leng;
if(i<0||i>len)
{
cout<<"out of range./n"<<endl;
}
return *(ptr+i);
}

int String::find(String& str1) // 查找
{
int i=0,t=0,j=0;
for(;i<m_leng;i++)
{
if(j==str1.length()-1)
{
for(int k=0;k<m_leng;k++)
{
if(*(ptr+k)==*(str1.ptr+0))
return k;
}
}
if(*(ptr+i)==*(str1.ptr+j))
{
t=i+1;
j=j+1;
if(*(ptr+t)!=*(str1.ptr+j)&&j<str1.length())
{
i=i+1;
continue;
}
if(*(ptr+t)==*(str1.ptr+j)&&j<str1.length())
{
j++;
if(j==str1.length())
{
for(int k=0;k<m_leng;k++)
{
if(*(ptr+k)==*(str1.ptr+0))
return k;
}
}
}
}
}
return -1;
}

istream& operator>>(istream& in,String &str1) //输入流
{
char temp[2048];
in>>temp;
str1.ptr=new char[strlen(temp)+1];
for(int i=0;i<str1.length();i++)
{
*(str1.ptr+i)=*(temp+i);
}
return in;
}

ostream& operator<<(ostream& out,String& str1) //输出流
{
for(int i=0;i<str1.length();i++)
out<<*(str1.ptr+i);
return out;
}

你可能感兴趣的:(我为你死了2次了!)