我为你死了2次了!
来源:互联网 发布:不可使知之拼音 编辑:程序博客网 时间:2024/04/28 23:22
完成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次了!
- 我死了,你还会娶别人吗
- 我死了,你会娶别的女人吗?
- CSND啊,你害死了我。。。
- 让我晕死了N次的JDK5- @Override。。
- 我死了
- 我死了
- 我去了你的城市3次,你却生生把我错过
- 我从来没有得到过你,却好像已经失去了你千万次。
- 我死了你会娶其他女人吗?
- 还未你等着 我的心快死了
- 学习jni,快气死我了,进度慢死了,
- 水木,我为你能做的都做了!
- 因为Ipv6 我被苹果拒绝了2次
- 陌生人,你恰好途径了我的盛放,我的姿态,只因为你而绽放
- 我为你负了天下,从此以后,你便是我的天下
- 可爱死了!然后,就没有然后了…你已经死了——6种要你命的可爱家伙
- 如果你死了
- Struts2 Form 提交时的乱码问题解决办法
- Fedora Linux+Apache+MySQL+PHP安装配置
- JavaScript应用核心:事件处理概述
- pymssql数据库操作
- Xtrabackup-1.5 binary 安装备份恢复成功!
- 我为你死了2次了!
- 在Linux下安装Apache
- 我的2011展望
- Oracle 插入日历
- VB.NET的部署发布(2005)
- MFC CAsyncSocket
- 常用缓存算法简介
- 各种数据绑定控件作用与区别
- 毕业后第一个春节