自己实现一个简单的string

也是第七周的作业题,打开一看和小伙伴们都惊呆了,20个左右的函数要写,不过写完之后发现感觉还好。。虽然写的过程很恶心。。。总结了一些心得。

ps:我的cpp代码在我的编译器xcode上是编译不通过的,它会提示有的bool的函数“可能没有返回值”。。。比较坑。。

------------------------------------

题里给的头文件

#ifndef SSCPP2014_STRING_H

#define SSCPP2014_STRING_H

 

#include <iostream>

 

class String {

private:

    char *_buff;

    int _length, _size;  // _size is of the allocated memory

    

public:

    // constructors

    String();

    explicit String(const char *src);

    String(const String &src);

    // destructor

    ~String();

    // member methods

    void assign(const char *src);

    void append(const char &other);

    void clear();

    int compare(const String &other) const;

    const char* c_str() const;

    bool empty() const;

    int find(const String &other, int pos = 0) const;

    int length() const;

    String substr(const int &pos, const int &count) const;

    // overload operators

    char& operator[](constint &index);

    void operator=(const String &other);

    voidoperator=(constchar *src);

    String operator+(const String &other) const;

    booloperator<(constString &other) const;

    booloperator<=(constString &other) const;

    booloperator>(constString &other) const;

    booloperator>=(constString &other) const;

    booloperator==(constString &other) const;

    booloperator!=(constString &other) const;

    // friend methods

    friend std::ostream& operator<<(std::ostream& out, const String &str);

    // non-meaning static property

    staticchar _error_sign;  // initial as any char is okay

};

 

#endif

 ---------------------------------------------------

题里给的main函数

#include <iostream>

#include <cstring>

#include "String.h"

#include <string>

usingnamespacestd;

 

String a, b("MFGZ!");

String c = b;

 

void display() {

    cout << a.empty() << " " << a.length() << " " << a << endl;

    cout << b.empty() << " " << b.length() << " " << b << endl;

    cout << c.empty() << " " << c.length() << " " << c << endl;

}

 

int main() {

    string aa, bb, cc;

    display();

    c[0] = 'K';

    display();

    cin >> aa >> cc;

    a.assign(aa.c_str());

    c.assign(cc.c_str());

    display();

    b.clear();

    display();

    for (int i = 0 ; i < 10; ++i) {

        char t;

        cin >> t;

        a.append(t);

        b.append(t);

        c.append(t);

    }

    display();

    b = c;

    display();

    b =  a + c;

    display();

    cout << a.find(String("1993")) << endl;

    cout << b.find(String("HYOUKA")) << endl;

    cout << c.find(String("RIKKA")) << endl;

    cout << a.substr(0, 3) << endl;

    cout << b.substr(3, 8) << endl;

    cout << c.substr(6, 1) << endl;

    cout << (a > b) << (a >= b) << (a < b) << (a <= b) << (a == b) << endl;

    cout << a.compare(b) << b.compare(a) << endl;

    cout << (a > c) << (a >= c) << (a < c) << (a <= c) << (a == c) << endl;

    cout << a.compare(c) << c.compare(a) << endl;

    b = a;

    cout << (a > b) << (a >= b) << (a < b) << (a <= b) << (a == b) << endl;

    cout << a.compare(b) << b.compare(a) << endl;

    cout << a.compare(a) << endl;

    return 0;

}

 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

//

//  String.cpp

//  自己写一个string

//

//  Created by apple on 14-4-11.

//  Copyright (c) 2014年 apple. All rights reserved.

//

 

#include "String.h"

#include <iostream>

#include <cstring>

#include<string>

usingnamespace std;

char String:: _error_sign = '\0';     //  

String::String() {     

    _buff = NULL;

    _length = 0;

    _size = 0;

}

String::String(const char *src) {

    _length = strlen(src);

    _size = _length + 1;

    _buff = new char[_size];

    memset(_buff, '\0', _size);      //  每一次都不能忘记赋初值不然会有内存访问错误。。。。。这个以前也没用过刚开始我还写的是 sizeof(_buff)

    for ( int i = 0; i < _length; i++ ) {     //  还好xcode提示我了。。。

        _buff[i] = src[i];

    }

    _buff[_length] = '\0';

}

String::String(const String &src) {

    _length = src._length;

    _size = src._size;

    _buff = new char[_size];

    memset(_buff, '\0', _size);

    for (int i = 0; i < _length; i++) {

        _buff[i] = src._buff[i];

    }

}

String::~String() {

    if (_buff != NULL) {

        delete []_buff;    //   刚开始抽风了,想着如何一个一个删。。。。。

    }

}

void String::assign(const char *src) {

    clear();

    _length = strlen(src);

    _size = _length + 1;

    _buff = new char[_size];

    memset(_buff, '\0', _size);

    for (int i = 0; i < _length; i++) {

        _buff[i] = src[i];

    }

}

void String::append(const char &other) {

    if (_buff == NULL) {

        _length = 1;

        _size = 2;

        _buff = new char[2]; 

        memset(_buff, '\0', _size);

        _buff[0] = other;

        _buff[1] = '\0';

    } else {

        char *temp = new char[_size+1];

        memset(temp, '\0', _size+1);

        _size += 1;

        _length += 1;

        for (int i = 0; i < _length - 1; i++) {

            temp[i] = _buff[i];

        }

        temp[_length-1] = other;

        delete []_buff;

        _buff = temp;

    }

}

void String::clear() {

    if (_buff != NULL) {

        delete []_buff;

    }

    _size = 0;

    _length = 0;

    _buff = NULL;

}

int String::compare(const String &other) const {

    int min = 0;

    int flag = 1;  //  这个写的太长太恶心了然后也没去优化。。就是分长度一样和不一样两种情况。

    if (_length == other._length) {   //  长度一样的时候很自然的就return 1,0和-1了

        for (int i = 0; i < _length; i++) {

            if (_buff[i] < other._buff[i]) {

                flag = 0;

                return -1;

            } else if (_buff[i] > other._buff[i]) {

                flag = 0;

                return 1;

            }

        }

        if (flag == 1)

            return 0;

    } else {    //   写的太丑了实在。。。

        if (_length < other._length)  {

            min = _length;

        } else {

            min = other._length;

        }

        

        flag = 1;

        for (int i = 0; i < min; i++) {

            if (_buff[i] < other._buff[i]) {

                flag = 0;

                return -1;

            } else if ( _buff[i] > other._buff[i] ) {  //    就这刚开始只写了else 导致我找了好久的错T。T。。。。

                flag = 0;

                return 1;

            }

        }

        if ( flag == 1 ) {    

            if (_length > other._length) {

                return 1;

            } else {

                return -1;

            }

        }

    }

}

const char* String::c_str() const {   //  返回_buff

    if (_buff !=  NULL) {

        return _buff;

    } else {

        return "";

    }

}

bool String::empty() const {

    if (_buff == NULL) {

        return true;

    } else {

        return false;

    }

}

int String::find(const String &other, int pos) const {

    int i;

    bool flag = true;

    for (i = 0; i < _length; ++i) {

        flag = true;

        if ( _length - i < other._length ) {   //  我的想法好像还比较自然,如果other的长度大于_length-i那肯定找不到。。。

            return _length;

        } else {

            for (int j = 0; j < other._length; ++j) {

                if ( _buff[j+i] != other._buff[j] ) {

                    break;

                    flag = true;

                }

                if ( j == other._length-1 && flag ) {

                    return i;

                }

                if ( j == other._length -1 && flag == false)

                    return _length;

            }

        }

    }

}

int String::length() const {

    return_length;

}

String String::substr(const int &pos, const int &count) const {

    String a;     //   从pos起,找出count个字符

    a._length = count;

    int j = pos;

    a._size = count + 1;

    a._buff = new char[a._size];

    memset(a._buff, '\0', a._size);

    for (int i = 0; i < a._length; i++) {

        a._buff[i] = _buff[j + i];

    }

    return a;

}

char& String::operator[](constint &index) {

    if (index < _size &&index >= 0) {

        return _buff[index];

    } else {

        return_error_sign;

    }

}

voidString::operator=(constString &other) {

    clear();

    _size = other._size;

    _length = other._length;

    _buff = new char[_size];

    memset(_buff, '\0', _size);

    for (int i = 0; i < _length; i++) {

        _buff[i] = other._buff[i];

    }

}

void String::operator=(constchar *src) {

    clear();

    _length = strlen(src);

    _size = _length + 1;

    _buff = new char[_size];

    memset(_buff, '\0', _size);

    for (int i = 0; i < _length; i++) {

        _buff[i] = src[i];

    }

}

String String::operator+(constString &other) const {  //好多空格在复制粘贴过程中就不见了怎么破。。。

    String a;

    a._length = _length + other._length;

    a._size = _size + other._length;

    a._buff = new char[a._size];

    memset(a._buff, '\0', a._size);

    for (int i = 0; i < _length; i++) {

        a._buff[i] = _buff[i];

    }

    for ( int i = _length, j = 0; i < a._length; i++, j++ ) {

        a._buff[i] = other._buff[j];

    }

    a._buff[a._length] = '\0';

    return a;

}

bool String::operator<(constString &other) const {

    if (this->compare(other) == -1) {    //   利用写好的compare函数省了好多力气。。。

        return true;

    } else {

        returnfalse;

    }

}

bool String::operator<=(constString &other) const {

    if (this->compare(other) == 1) {

        returnfalse;

    } else {

        return true;

    }

    

}

bool String::operator>(constString &other) const {

    if (this->compare(other) == 1) {

        return true;

    } else {

        returnfalse;

    }

    

}

bool String::operator>=(constString &other) const {

    if (this->compare(other) == -1) {

        returnfalse;

    } else {

        return true;

    }

}

boo lString::operator==(constString &other) const {

    if (!this->compare(other)) {

        return true;

    } else {

        returnfalse;

    }

}

boolString::operator!=(constString &other) const {

    if (this->compare(other) != 0) {

        return true;

    } else {

        returnfalse;

    }

    

}

ostream& operator<<(std::ostream& out, const String &str) {

    for (int i = 0; i < str._length; i++) {

        out << str._buff[i];

    }

    return out;

}

 

 

 

转载于:https://www.cnblogs.com/SunnyInSysu/p/3668467.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值