class String
{
friend ostream& operator<< (ostream &output, String &s);
friend istream& operator>> (istream &input, String &s);
private:
int m_len;
char *m_str;
public:
String(int len = 0);
String(const char *str);
String(const String &s);
~String();
public:
char& operator[](int index);
String& operator=(const char *str);
String& operator=(const String &s);
bool operator==(const String &s)const;
bool operator==(const char *str)const;
bool operator!=(const String &s)const;
bool operator!=(const char *str)const;
int operator>(const String &s)const;
int operator<(const String &s)const;
int operator>(const char *str)const;
int operator<(const char *str)const;
public:
char *c_str()
{
return m_str;
}
const char *c_str1()
{
return m_str;
}
int length()
{
return m_len;
}
};
ostream& operator << (ostream &output, String &s)
{
output << s.m_str;
return output;
}
istream& operator >> (istream &input, String &s)
{
input >> s.m_str;
return input;
}
String::String(int len)
{
if (len == 0)
{
m_len = len;
m_str = new char[m_len + 1];
*m_str = '\0';
}
else if (len > 0)
{
m_len = len;
m_str = new char[m_len + 1];
memset(m_str, 0, m_len);
}
}
String::String(const char *str)
{
if (str == NULL)
{
m_len = 0;
m_str = new char[m_len + 1];
*m_str = '\0';
}
else
{
m_len = strlen(str);
m_str = new char[m_len + 1];
memcpy(m_str, str, m_len + 1);
}
}
String::String(const String &s)
{
m_len = s.m_len;
m_str = new char[m_len + 1];
memcpy(m_str, s.m_str, m_len + 1);
}
String::~String()
{
if (m_str != NULL)
{
delete[] m_str;
m_str = NULL;
m_len = 0;
}
}
String& String::operator=(const char *str)
{
if (m_str != NULL)
{
delete[] m_str;
m_str = NULL;
m_len = 0;
}
if (str == NULL)
{
m_len = 0;
m_str = new char[m_len + 1];
*m_str = '\0';
}
else
{
m_len = strlen(str);
m_str = new char[m_len + 1];
memcpy(m_str, str, m_len + 1);
}
return *this;
}
String& String::operator=(const String &s)
{
if (m_str != NULL)
{
delete[] m_str;
m_str = NULL;
m_len = 0;
}
m_len = strlen(s.m_str);
m_str = new char[m_len + 1];
memcpy(m_str, s.m_str, m_len + 1);
return *this;
}
char& String::operator[](int index)
{
return m_str[index];
}
bool String::operator==(const String &s)const
{
if (m_len != s.m_len)
{
return false;
}
if (strcmp(m_str, s.m_str) == 0)
{
return true;
}
return false;
}
bool String::operator==(const char *str)const
{
if (str == NULL)
{
if (m_len == 0)
{
return true;
}
return false;
}
if(m_len != strlen(str))
{
return false;
}
else if (strcmp(m_str, str) == 0)
{
return true;
}
return false;
}
bool String::operator!= (const String &s)const
{
return !(*this == s);
}
bool String::operator!= (const char *str)const
{
return !(*this == str);
}
int String::operator> (const String &s)const
{
return strcmp(m_str, s.m_str);
}
int String::operator< (const String &s)const
{
return strcmp(s.m_str, m_str);
}
int String::operator> (const char *str)const
{
return strcmp(m_str, str);
}
int String::operator< (const char *str)const
{
return strcmp(str, m_str);
}