关闭

第12周项目4-String类的构造

112人阅读 评论(0) 收藏 举报

问题与代码

/* 
*copyright (t) 2016,烟台大学计算机学院 
*All rights reserved. 
*文件名称:test.cpp 
*作者:张晴晴 
*完成日期:2016年6月1日 
*版本号:v1.0 
*问题描述:
请构造String类的加、减运算。
其中,s1 + s2将两个字符串的连接起来;
s1 - s2是将s1的尾部空格和s2的前导空格去除后的连接。
提示:有指针成员,设计时要注意。 
*输入描述: 
*程序输出: 
*/  
 


#include<iostream>
#include<Cstring>
using namespace std;
class String
{
public:
    String ();//默认构造函数
    String(const char *s);
    String(String &str);//构造函数
    ~String();
    void display();
    friend String operator +(String &s1,String &s2);
    friend String operator -(String &s1,String &s2);
private:
    char *p;//字符型指针用于指向字符串
    int len;
};
String::String()
{
    len=0;
    p=NULL;
}
    String::String(const char *s)
    {
        len=strlen(s);
        p=new char [len+1];
        strcpy(p,s);
    }
    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)//当p内无储存的值时析构
        delete []p;
    }
    void String::display()//输出指向的字符串
    {
        cout<<p<<endl;//不是应该输出的是*p??
        //*p是指向字符串的指针,加上*p只会输出第一个字符不加会输出一串,就像打开一扇门,门后面的也就出来了。
    }
    String operator +(String &s1,String &s2)
    {
        String s;
        s.len=s1.len+s2.len;
        s.p=new char[s.len+1];
        //注意重新定义容量用的是[]
        strcpy(s.p,s1.p);
        strcat(s.p,s2.p);//下有补充
        return s;
    }
/*
    将两个char类型链接。
    char d="GoldenGlobal";
    char *s="View";
    strcat(d,s);
    结果放在d中
    printf("%s",d);
    输出 d 为 GoldenGlobalView (中间无空格)
    d和s所指内存区域不可以重叠且d必须有足够的空间来容纳s的字符串。
    返回指向d的指针。
*/
   String operator -(String &s1,String &s2)
   {
       String s;
       //c1是截去尾部空格的字符串
       char *c1=new char [s1.len+1];
                                    //格式:strlen (字符数组名)
                                   //功能:计算给定字符串的(unsigned int型)长度,不包括'\0'在内
                                  //说明:返回s的长度,不包括结束符NULL。
       strcpy(c1,s1.p);
       int i=s1.len-1;//为什么要-1;
       while(i>=0&&c1[i]==' ')//这是删去第一个字符串后面多余的空格
        --i;
       c1[i+1]='\0';//c1结束


       char *c2=new char [s2.len+1];//c2是去除前导空格的字符串
       strcpy(c2,s2.p);
       i=0;
       while(i<s2.len&&c2[i]==' ')
        ++i;
       int j=0;
       while(i<s2.len&&c2[i]!='\0')//这步是删去c2前面的空格
       {
           c2[j]=c2[i];
           ++i;
           ++j;
       }
       c2[j]='\0';//c2结束


       //将这两部分接起来
       s.len=strlen(c1)+strlen(c2);
       s.p=new char[s.len+1];
       strcpy(s.p,c1);
       strcat(s.p,c2);
       delete c1;
       delete c2;
       return s;

   }
   int main()
   {
       String string1("   Hello   "),string2("   World   ");
       string1.display();
       string2.display();
       String string3;
       string3=string1+string2;
       string3.display();
       string3=string1-string2;
       string3.display();
       return 0;

   }

题目要求:

运行结果:


学习心得:


这个问题好麻烦啊,代码理解很难,补充的知识点都写进代码了,但是还有一个疑问,第95行的问题现在还没人解答出来呢!!!!

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:44820次
    • 积分:3047
    • 等级:
    • 排名:第11407名
    • 原创:271篇
    • 转载:4篇
    • 译文:0篇
    • 评论:12条
    最新评论