满足示例要求,使用字符数组部分实现 MyString 类

使用字符数组部分实现 MyString 类,方便其他开发人员使用。
1)该题目中类似模拟 string 的操作,培养开发库的能力。
2)使用字符数组实现,不能直接调用 string 或者 CString 等类库。
3)使用 String 类示例

img

#include <iostream>
using namespace std;

int strlen(char *s)
{
    int n = 0;
    while(s[n] != 0)
        n++;
    return n;
}

class String
{
protected:
    char *s;
public:
    int getlen() { if(s==NULL) return 0;return strlen(s);}
    String() {s = NULL;}
    String(const char *a)
    {
        int len = strlen(a);
        s = (char*)malloc(len+1);
        for(int i=0;i<len;i++)
            s[i] = a[i];
        s[len] = 0;
    }
    String(const String &a)
    {
        int len = strlen(a.s);
        s = (char*)malloc(len+1);
        for(int i=0;i<len;i++)
            s[i] = a.s[i];
        s[len] = 0;
    }
    void operator = (const char *a);
    void operator = (String a);
    int index(const char *a);
    int lastIndex(const char *a);
    char *toUpperCase();
    char *Replace(char *a,char *b);
};
void String::operator = (const char *a)
{
    int len = strlen(a);
    if(s != NULL)
        free(s);
    s = (char*)malloc(len+1);
    for(int i=0;i<len;i++)
        s[i] = a[i];
    s[len] = 0;
}

void String::operator = (String a)
{
    int len = a.getlen();
    if(s != NULL)
        free(s);
    s = (char*)malloc(len+1);
    for(int i=0;i<len;i++)
        s[i] = a.s[i];
    s[len] = 0;
}

int String::index(const char *a)
{
    if(s==NULL)
        return -1;
    int len = strlen(s);
    int n = strlen(a);
    int i,j;
    for(i=0;i<=len-n;i++)
    {
        for(j=0;j<n;j++)
        {
            if(s[i+j] != a[j])
                break;
        }
        if(j==n)
            return i;
    }
    return -1;
}

int String::lastIndex(const char *a)
{
    if(s==NULL)
        return -1;
    int len = strlen(s);
    int n = strlen(a);
    int i,j;
    for(i=len-n;i>=0;i--)
    {
        for(j=0;j<n;j++)
        {
            if(s[i+j] != a[j])
                break;
        }
        if(j==n)
            return i;
    }
    return -1;
}

char *String::toUpperCase()
{
    if(s==NULL)
        return s;
    int i=0;
    while(s[i] != 0)
    {
        if(s[i]>='a' && s[i]<='z')
            s[i] -= 32;
        i++;
    }
    return s;
}

char *String::Replace(char *a,char *b)
{
    if(s==NULL)
        return s;
    int n = index(a);
    int lena = strlen(a);
    int lenb = strlen(b);
    int len = strlen(s);
    int i=0,j,k=0;
    //
    while(n>=0)
    {
        i=0;
        k=0;
        char *p = (char*)malloc(len + lenb-lena+1);
        while(i<n)
        {
            p[i] = s[i];
            i++;
        }
        for(j=0;j<lenb;j++)
            p[i++] = b[j];
        while(s[n+lena+k] != 0)
        {
            p[i++] = s[n+lena+k];
            k++;
        }
        p[i] = 0;
        free(s);
        s = p;
        n = index(a);
    }
    return s;
}

int main()
{
    String str1 = "hello";
    String str2;
    String str3 = str1;
    cout<<str3.index("llo")<<endl;
    cout<<str3.lastIndex("llo")<<endl;
    cout<<str1.toUpperCase()<<endl;
    cout<<str1.Replace("L","O")<<endl;
    return 0;
}