String.h实现

 

String.h

 1 #pragma once
 2 #include <iostream>
 3 
 4 #pragma warning(disable:4996)
 5 
 6 using namespace std;
 7 
 8 class String
 9 {
10 private:
11     friend String operator+(const String& lhs, const String& rhs);
12     friend String operator-(const String& lhs, const String& rhs);
13     friend ostream& operator<<(ostream& out, const String& src);
14     friend istream& operator>>(istream& in, String& src);
15 
16 public:
17     String(char* ptr = NULL);
18     ~String();
19     String(const String& src);
20 
21 public:
22     bool operator>(const String& src);
23     bool operator<(const String& src);
24     bool operator==(const String& src);
25     bool operator!=(const String& src);
26     String& operator=(const String& src);
27 
28     int length()const;
29     const char* c_str()const { return Str; }
30 
31 private:
32     char* Str;
33 
34 };

 

String.cpp

  1 #include "String.h"
  2 #include <iostream>
  3 #include <cstdio>
  4 #include <cstring>
  5 
  6 #pragma warning(disable:4996)
  7 
  8 int String::length()const { return strlen(this->Str); }
  9 
 10 String::String(char* ptr)
 11 {
 12     if (ptr == NULL)
 13     {
 14         Str = new char[1];
 15         *Str = '\0';
 16     }
 17     else
 18     {
 19         Str = new char[strlen(ptr) + 1];
 20         strcpy(Str, ptr);
 21     }
 22 }
 23 String::~String()
 24 {
 25     delete[]Str;
 26     Str = NULL;
 27 }
 28 String::String(const String& src)
 29 {
 30     Str = new char[src.length() + 1];
 31     strcpy(Str, src.Str);
 32 }
 33 
 34 String& String::operator=(const String& src)
 35 {
 36     if (this == &src)
 37     {
 38         return*this;
 39     }
 40     delete[]Str;
 41     Str = NULL;
 42     Str = new char[src.length() + 1];
 43     strcpy(Str, src.Str);
 44     return *this;
 45 }
 46 
 47 bool String::operator>(const String& src) { 
 48     return strcmp(Str, src.Str) > 0; 
 49 }
 50 bool String::operator<(const String& src) { 
 51     return strcmp(Str, src.Str) < 0; 
 52 }
 53 bool String::operator==(const String& src) { 
 54     return strcmp(Str, src.Str) == 0; 
 55 }
 56 bool String::operator!=(const String& src) { 
 57     return strcmp(Str, src.Str) != 0; 
 58 }
 59 
 60 String operator+(const String& lhs, const String& rhs)
 61 {
 62     char* ptmp = new char[lhs.length() + rhs.length() + 1];
 63     strcpy(ptmp, lhs.Str);
 64     strcat(ptmp, rhs.Str);
 65     String tmp(ptmp);
 66     delete ptmp;
 67     return tmp;
 68 }
 69 
 70 String operator-(const String& lhs, const String& rhs) {
 71     char* str1 = new char[lhs.length() + 1];
 72     char* str2 = new char[rhs.length() + 1];
 73     strcpy(str1, lhs.Str);
 74     strcpy(str2, rhs.Str);
 75     int nA = lhs.length(), nB = rhs.length();
 76     char* ptmp = new char[lhs.length() + 1];
 77 
 78     bool flag = true;
 79     int k = 0;
 80     for (size_t i = 0; i < strlen(str1); ++i) {
 81         for (size_t j = 0; j < strlen(str2); ++j) {
 82             if (str1[i] == str2[j]) {
 83                 flag = false;
 84                 break;
 85             }
 86         }
 87         if (flag) {
 88             ptmp[k] = str1[i];
 89             ++k;
 90         }
 91         flag = true;
 92     }
 93     char* str = new char[k+1];
 94     for (int i = 0 ; i < k; ++i) {
 95         str[i] = ptmp[i];
 96     }
 97 
 98     str[k] = '\0';
 99 
100     String tmp(str);
101     delete[] ptmp;
102     delete[]str1;
103     delete[] str2;
104     return tmp;
105 }
106 
107 ostream& operator<<(ostream& out, const String& src)
108 {
109     out << src.Str << endl;
110     return out;
111 }
112 
113 istream& operator>>(istream& in, String& src)
114 {
115     char buff[1024] = { 0 };
116     in >> buff;
117     delete[]src.Str;
118     src.Str = new char[strlen(buff) + 1];
119     strcpy(src.Str, buff);
120     return in;
121 }

 

main.cpp

#include <iostream>
#include "String.h"

using namespace std;

String str;

void Operate_Biu();

void Menu() {
    cout << "\t\t*************字符串类的实现与设计***********" << endl;
    cout << "\t\t*                1.字符串输入              *" << endl;
    cout << "\t\t*                2.字符串运算              *" << endl;
    cout << "\t\t*                3.字符串输出              *" << endl;
    cout << "\t\t*                0.退出程序                *" << endl;
    cout << "\t\t********************************************" << endl;
}

void Operate_Menu() {
    system("cls");
    cout << "\t\t*************字符串运算***********" << endl;
    cout << "\t\t*          1.字符串连接          *" << endl;
    cout << "\t\t*          2.字符串剩余子串      *" << endl;
    cout << "\t\t*          3.字符串比较          *" << endl;
    cout << "\t\t**********************************" << endl;
    Operate_Biu();
}

void Input() {
    cout << "请输入字符串:" << endl;
    cin >> str;
    cout << "输入成功!" << endl;
}

void Output() {
    cout << "输出字符串:" << str << endl;
    cout << "输出成功!" << endl;
}

void Operate_Biu() {
    int op;
    String str1, str2;
    cout << "请输入操作数:" << endl;
    cin >> op;
    cout << "请输入两个字符串:" << endl;
    cin >> str1 >> str2;
    switch (op) {
    case 1:
        cout << "字符串连接:";
        cout << str1 + str2 << endl;
        break;
    case 2:
        cout << "字符串相减:";
        cout << str1 - str2 << endl;
        break;
    case 3:
        cout << "字符串比较:";
        if (str1 > str2)
            cout << str1 << "较大" << endl;
        else if (str1 == str2)
            cout << str1 << "" << str2 << "相等" << endl;
        else
            cout << str2 << "较大" << endl;
        break;
    }
}

int main()
{
    int choose;
    while (1) {
        Menu();
        cout << "请输入操作:";
        cin >> choose;
        switch (choose) {
        case 1:
            Input();
            break;
        case 2:
            Operate_Menu();
            break;
        case 3:
            Output();
            break;
        default:
            cout << "没有该选项,请重新输入!" << endl;
            break;
        }
        system("PAUSE");
        system("cls");
    }

    system("PAUSE");
}

 

posted @ 2019-06-19 14:19  Hk_Mayfly  阅读(307)  评论(0)    收藏  举报