(C/C++)扩展String类

馋奶兔 提交于 2020-01-23 03:21:46

扩展String类

题目:扩展String类,引入头文件CString.h,它的内容如下:
#include
using namespace std;
class String{
protected:
char *mystr;
int len;
public:
String(const char *p){
len = strlen§;
mystr = new char[len+1];
strcpy(mystr,p);
}
~String(){
if (mystr !=NULL)
{
delete []mystr;
mystr = NULL;
len = 0;
}
}
void showStr(){cout <<mystr;}
char * GetStr(){return mystr;}
virtual bool IsSubString(const char *str){
int i,j;
for (i =0;i<len;i++)
{
int k = i;
for (j =0;str[j] !=’\0’;j++,k++)
{
if (str[j]!= mystr[k]) break;
}
if(str[j] ==’\0’) return true;
}
return false;
}
};

class EditString:public String{
public:
EditString(const char *p):String§{}
int IsSubString(int start, const char *str);
void EditChar(char s, char d);
void EditSub(char * subs,char *subd);

void DeleteChar(char ch);  
void DeleteSub(char * sub); 

};

实现int IsSubString(int start, const char *str);
从start处开始判断str是否为字符串的子串,是则返回子串第一次出现处的下标位置(下标从0开始计算),否则返回-1;
例如:
EditString es(“testtesttest”);
es.IsSubString(3,“test”);//4

实现EditChar(char s, char d),用字符d代替所有字符s,例如:
EditString es(“testtesttest”);
es.EditChar(‘t’,‘a’);//“aesaaesaaesa”

实现void EditSub(char * subs,char *subd),用字符串subd代替所有字符串subs,例如:
EditString es(“testtesttest”);
es.EditChar(‘test’,‘str’);//“strstrstr”

实现void DeleteChar(char ch),将所有ch字符删除,例如:
EditString es(“testtesttest”);
es.DeleteChar(‘t’);//“eseses”

实现void DeleteSub(char * sub),将所有的字符串sub删除,例如:
EditString es(“testtesttest”);
es.DeleteSub(‘es’);//“tttttt”;

代码:

#include <iostream>
#include <cmath>
#include <cstring>
#include <string>
using namespace std;

class String{
protected:
    char *mystr;
    int len;
public:
    String(const char *p){
        len = strlen(p);
        mystr = new char[len+1];
        strcpy(mystr,p);
    }
    ~String(){
        if (mystr !=NULL)
        {
            delete []mystr;
            mystr = NULL;
            len = 0;
        }
    }
    void showStr(){cout <<mystr;}
    char * GetStr(){return mystr;}
    virtual bool IsSubString(const char *str){
        int i,j;
        for (i =0;i<len;i++)
        {
            int k = i;
            for (j =0;str[j] !='\0';j++,k++)
            {
                if (str[j]!= mystr[k]) break;
            }
            if(str[j] =='\0') return true;
        }
        return false;
    }
};

class EditString:public String{
public:
    EditString(const char *p):String(p){}
    int IsSubString(int start, const char *str);
    void EditChar(char s, char d);
    void EditSub(char * subs,char *subd);

    void DeleteChar(char ch);
    void DeleteSub(char * sub);

};

int EditString::IsSubString(int start, const char *str)
{
    int size = strlen(str);
    if (start < 0)
    {
        return -1;
    }
    if (len - start >= size)//判断字符串总长度减去从开始检测的长度是否大于要测试字符串的长度
    {
        int flag = String::IsSubString(str);//判断这个要检测的字符串是否在总字符里
        int i = 0;
        if(flag != 0)
        {
            for (int i = start; i < len; i++)
                {
                    int k = i, j = 0;//注意这里的j=0表示在下面的for循环里比较的过程中如果str字符串没比较完就跳出去(没有返回值),那么就让总字符串里start的下一个下标的字符开始重新和str进行比较
                    for (; j < len; j++, k++)
                    {
                        if (*(mystr+k) != *(str+j))//字符一个个比较,因为返回的是从start处开始第一次出现的下标,如果字符相等,继续for循环,直到不相等的时候跳出去
                            break;
                    }
                    if (*(str+j) == 0)//这里的意思是上面跳出来的时候,str字符串是否已经走到末尾了,如果走到末尾,那表示它为空,直接返回i
                    {
                        return i;
                    }
                }
            return -1;
        }
    }
    else
    {
        return -1;
    }
}

void EditString::EditChar(char s, char d)
{
    for (int i = 0; i < len; ++i)
    {
        if (mystr[i] == s)
        {
           mystr[i] = d;
        }
    }
}

void EditString::EditSub(char *subs, char *subd)
{
    if (String::IsSubString(subs))
        {
            char str[100]={0};
            int indexs=0;
            int indexd=0;
            for (int i=0; i<len; ++i)
            {
                if(i ==  IsSubString(i,subs))//利用题目的函数来得出subs从i开始,第一次出现的下标,在这之前,如果不等于的话,那么就执行下面的 str[indexd++] = mystr[i];先赋值
                {
                    for (indexs = 0;indexs < strlen(subd); ++indexs)//等于的时候进来将subd赋给str
                    {
                        str[indexd++] = subd[indexs];
                    }
                    i+=strlen(subs)-1;
                    continue;
                }
                str[indexd++] = mystr[i];
            }
            delete []mystr;
            mystr = new char[indexd+1];
            strcpy(mystr,str);
        }
}

void EditString::DeleteChar(char ch)
{
    char pp[256] = {0};
    int k = 0;
    for (int i = 0; i < len; ++i)
    {
        if (mystr[i] != ch)
        {
            pp[k] = mystr[i];
            k++;
        }
    }
    delete [] mystr;
    mystr = new char[strlen(pp)+1];
    strcpy(mystr, pp);
}

void EditString::DeleteSub(char *sub)
{
    if(String::IsSubString(sub))
    {
        char str[100] = {0};
        int indexs=0;
        int indexd=0;
        int index = 0;
        for (int i=0; i<len; ++i)
        {
            if(i ==  IsSubString(i,sub))
            {
                for (indexs = 0;indexs < strlen(sub); ++indexs)
                {
                    indexd++;
                }
                i+=strlen(sub)-1;
                continue;
            }
            str[index++] = mystr[i];
        }
        delete []mystr;
        mystr = new char[index+1];
        strcpy(mystr,str);
    }
}




易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!