用C++怎么写,面试遇到的

用c++ 实现字符串操作类。成员函数需要有:str_copy,str_compare,str_lenth,字符串可以用 ‘+’ 实现两个字符串连接,所有的字符串都用 char * 或者 char 数组。不得用字符串操作的系统函数。

'+'可以重载操作符

#include <iostream>
using namespace std;
class mystring
{
protected:
    char s[1000];
public:
    mystring() {};
    mystring(char *p)
    {
        int i=0;
        while(p[i] != '\0')
        {
            s[i] = p[i];
            i++;
        }
        s[i] = '\0';
    }
    int str_length() 
    {
        int i=0;
        while(s[i++] != '\0');
        return i-1;
    }
    mystring& operator + (mystring b)
    {
        int len = str_length();
        int i=0;
        while(b.s[i] != '\0')
        {
            s[len+i] = b.s[i];
            i++;
        }
        s[len+i] = '\0';
        return *this;
    }
    void str_cpy(mystring b)
    {
        int i=0;
        while(b.s[i] != '\0')
        {
            s[i] = b.s[i];
            i++;
        }
        s[i] = '\0';
    }
    int str_compare(mystring b)
    {
        int i=0,j=0;
        while(s[i] != '\0' && b.s[j] != '\0')
        {
            if(s[i] != b.s[j])
                break;
            i++;
            j++;
        }
        if(s[i] == '\0' && b.s[j] == '\0')
            return 0;
        if(s[i] == '\0')
            return -1;
        if(b.s[j] == '\0')
            return 1;
        if(s[i] > s[j])
            return 1;
        return -1;
    }
    friend ostream& operator << (ostream &cout,mystring &b);
};

    ostream& operator << (ostream &cout,mystring &b)
    {
        cout<<b.s;
        return cout;
    }

int main()
{
    mystring s1("Hello");
    mystring s2("Yes");
    s1 = s1 + s2;
    cout<<s1.str_length()<<endl;
    cout<<s1<<endl;
    cout<<s1.str_compare(s2)<<endl;
   return 0;

}

#ifndef _H_MyString
#define _H_MyString

#include <iostream>

namespace MyString {

    template<typename T>
    class It {
    private:
        T* data;
    public:
        It(T* data) {
            this->data = data;
        }

    };

    class String {

    private:
        char* data;
        size_t size;
    public:
        String(const char* data);

        void setLength(size_t size);

        bool str_compare(const String &string) const;

        size_t str_lenth() const;

        void add(const String &text);

        String str_copy() const;
        
        char* getData() const;

    };

    String operator+(const String &string1, const String &string2);

}
#endif
#include "String.h"
#include <string.h>
#include <iostream>
using namespace std;

namespace MyString
{

    /**
     * Constructor with char*
     */
    String::String(const char *data)
    {
        size_t size = strlen(data);

        this->data = new char[size];
        this->size = size;

        if (this->data != NULL)
        {
            strncpy(this->data, data, size);
        }
    }

    /**
     * Copy Constructor
     */
    String String::str_copy() const
    {
        char *data = new char[this->size];
        if (this->data != NULL)
        {
            strncpy(data, this->data, this->size);
        }
        return MyString::String(data);
    }
    void String::setLength(size_t size)
    {
        size_t old_length = this->str_lenth();
        char *old_data = this->data;

        this->size = size;
        this->data = new char[size];

        // Copy the characters (or add \0 if there are no characters anymore).
        for (size_t i = 0; i < size; i++)
        {
            if (i < old_length)
            {
                this->data[i] = old_data[i];
            }
            else
            {
                this->data[i] = '\0';
            }
        }

        // Destroy the old data
        delete[] old_data;

        // Ensure that the last element is \0
        this->data[size] = '\0';
    }

    size_t String::str_lenth() const
    {
        return strlen(this->data);
    }

    void String::add(const String &text)
    {
        size_t new_size = this->size + text.size;
        setLength(new_size);

        size_t length = str_lenth();
        for (size_t i = length; i < new_size; i++)
        {
            this->data[i] = text.data[i - length];
        }
    }

    bool String::str_compare(const String &string) const
    {
        return strcmp(this->data, string.data) == 0;
    }

    char *String::getData() const
    {
        return this->data;
    }

    /** Free Operator Methods **/

    String operator+(const String &string1, const String &string2)
    {
        String string = String(string1);
        string.add(string2);

        return string;
    }

    bool operator==(const String &string1, const String &string2)
    {
        return string1.str_compare(string2);
    }

}

int main(int argc, char const *argv[])
{

    MyString::String string1("Welt");
    cout << string1.getData() << endl;
    cout << "字符串长度:" << string1.str_lenth() << endl;
    MyString::String string2 = string1.str_copy();
    cout << "字符串比较:" << string2.str_compare(string1) << endl;
    MyString::String string3 = string1 + string2;
    cout << "字符串相加:" << string3.getData() << endl;
    cout << "字符串比较:" << string3.str_compare(string1) << endl;
    return 0;
}