问题及代码:
/*
*Copyright (c)2014,烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:Project.cpp
*作 者:chenqin.
*完成日期:2015年4月29日
*版 本 号:v1.0
*
*问题描述:写一个能处理字符串的类.请构造String类的加、减运算。其中,s1 + s2将两个字符串的连接起来;s1 - s2是将s1的尾部空格和s2的前导空格去除后的连接。
*程序输入:略
*程序输出:略
*/
#include <iostream>
using namespace std;
#include <Cstring>
class String
{
public:
//需要的成员函数(若需要的话,声明友元函数)
String(){p=NULL;len=0;}
String(char *str);
String(String &Str);
~String();
friend String operator+(String &str1,String &str2);
friend String operator-(String &str1,String &str2);
void display();
private:
char *p; //指向存储的字符串
int len; //记录字符串的长度
};
void String::display()
{
cout <<p<<endl;
}
String::String(char *str)
{ len=strlen(str);
p=new char[len+1];
strcpy(p,str);
}
String::String(String &str)
{
len =str.len;
if(p!=NULL) delete[]p;
p=new char[len+1];
strcpy(p,str.p);
}
String::~String()
{
if(!p)
delete[]p;
}
String operator+(String &str1,String &str2)
{
String str;
str.len=str1.len+str2.len;
str.p=new char[str.len+1];
strcpy(str.p,str1.p);
strcat(str.p,str2.p);
return str;
}
String operator-(String &str1,String &str2)
{
String str;
char *c1=new char[str1.len+1];
strcpy(c1,str1.p);
int i=str1.len-1;
while (i>=0&&c1[i]==' ')
--i;
c1[i+1]='\0';
char*c2=new char[str2.len+1];
strcpy(c2,str2.p);
i=0;
while(i<str2.len&&c2[i]==' ') ++i;
int j=0;
while(i<str2.len&&c2[i]!='\0')
{
c2[j]=c2[i];
++i;
++j;
}
c2[j]='\0';
str.len=strlen(c1)+strlen(c2);
str.p=new char[str.len+1];
strcpy(str.p,c1);
strcat(str.p,c2);
delete c1;
delete c2;
return str;
}
int main()
{
String string1(" hello "),string2(" world "),string3;
string1.display();
string2.display();
string3=string1+string2;
string3.display();
string3=string1-string2;
string3.display();
return 0;
}
运行结果:
学习心得:在处理两个字符串的过程中遇见很多问题,特别是将s1的尾部空格和s2的前导空格去除后的连接上,半天都没想明白,最后问了贺老师,老师用画图的方式才让我清晰理解了,老师说不懂的时候可以自己拿出笔自己画画,也许就懂了。