#ifndef MYSTRING_H
#define MYSTRING_H
#include<iostream>
using namespace std;
class MyString
{
friend ostream& operator<<(ostream& _cout, MyString& _MyString)
{
_cout << _MyString.string_address;
return _cout;
}
friend istream& operator>>(istream& _cin, MyString& _MyString)
{
if (_MyString.string_address) {
free(_MyString.string_address);
_MyString.string_address = NULL;
}
_MyString.string_address = (char*)calloc(1, 1024);
if (!_MyString.string_address)
cout << "分配内存失败" << endl;
_cin >> _MyString.string_address;
return _cin;
}
public:
MyString() :string_address(NULL)
{
}
MyString(const char* const_string)
{
string_address = (char*)calloc(1, strlen(const_string) + 1);
if (!string_address)
cout << "内存分配失败" << endl;
strcpy(string_address, const_string);
}
MyString(const MyString& other_MyString)
{
string_address = (char*)calloc(1, strlen(other_MyString.string_address) + 1);
if (!string_address)
cout << "内存分配失败" << endl;
strcpy(string_address, other_MyString.string_address);
}
~MyString()
{
if (string_address){
free(string_address);
string_address = NULL;
}
}
const char* c_str() const
{
return string_address;
}
size_t length()
{
return strlen(string_address);
}
size_t size()
{
return strlen(string_address);
}
MyString& operator=(const MyString& _MyString)
{
if (string_address) {
free(string_address);
string_address = NULL;
}
string_address = (char*)calloc(1, strlen(_MyString.string_address) + 1);
if (!string_address)
cout << "内存分配失败" << endl;
strcpy(string_address, _MyString.string_address);
return *this;
}
MyString& operator=(const char* const_string)
{
if (string_address) {
free(string_address);
string_address = NULL;
}
string_address = (char*)calloc(1, strlen(const_string) + 1);
if (!string_address)
cout << "内存分配失败" << endl;
strcpy(string_address, const_string);
return *this;
}
char& operator[](size_t index)
{
if (index >= length())
return string_address[length() - 1];
return string_address[index];
}
MyString& operator+=(MyString& _MyString)
{
if (string_address){
if (_MyString.string_address){
string_address = (char*)realloc(string_address, length() + strlen(_MyString.string_address) + 1);
if (!string_address)
cout << "内存分配失败" << endl;
strcat(string_address, _MyString.string_address);
}
}
else {
if (_MyString.string_address){
string_address = (char*)calloc(1, strlen(_MyString.string_address + 1));
if (!string_address)
cout << "内存分配失败" << endl;
strcpy(string_address, _MyString.string_address);
}
}
return *this;
}
MyString& operator+=(const char* const_string)
{
if (string_address) {
if (const_string) {
string_address = (char*)realloc(string_address,length() + strlen(const_string) + 1);
if (!string_address)
cout << "内存分配失败" << endl;
strcat(string_address, const_string);
}
}
else {
if (const_string) {
string_address = (char*)calloc(1, strlen(const_string) + 1);
if (!string_address)
cout << "内存分配失败" << endl;
strcpy(string_address, const_string);
}
}
return *this;
}
MyString operator+(MyString& _MyString)
{
if (string_address) {
if (_MyString.string_address) {
string_address = (char*)realloc(string_address, length() + _MyString.length() + 1);
if (!string_address)
cout << "内存分配失败" << endl;
strcat(string_address, _MyString.string_address);
}
}
else {
if (_MyString.string_address) {
string_address = (char*)calloc(1, _MyString.length() + 1);
if (!string_address)
cout << "内存分配失败" << endl;
strcpy(string_address, _MyString.string_address);
}
}
return *this;
}
MyString operator+(const char* const_string)
{
if (string_address) {
if (const_string) {
string_address = (char*)realloc(string_address, length() + strlen(const_string) + 1);
if (!string_address)
cout << "内存分配失败" << endl;
strcat(string_address, const_string);
}
}
else {
if (const_string) {
string_address = (char*)calloc(1, strlen(const_string) + 1);
if (!string_address)
cout << "内存分配失败" << endl;
strcpy(string_address, const_string);
}
}
return *this;
}
bool operator==(MyString& _MyString)
{
if (string_address)
if (_MyString.string_address)
if (!strcmp(string_address, _MyString.string_address))
return true;
else
if (!_MyString.string_address)
return true;
return false;
}
bool operator==(const char* const_string)
{
if (string_address)
if (const_string)
if (!strcmp(string_address, const_string))
return true;
else
if (!const_string)
return true;
return false;
}
bool operator!=(MyString& _MyString)
{
if (string_address)
if (_MyString.string_address)
if (strcmp(string_address, _MyString.string_address))
return true;
else
if (_MyString.string_address)
return true;
return false;
}
bool operator!=(const char* const_string)
{
if (string_address)
if (const_string)
if (strcmp(string_address, const_string))
return true;
else
if (const_string)
return true;
return false;
}
private:
char* string_address;
};
#endif