string类成员函数的自我实现
#include <iostream>
#include <cstring>
using namespace std;
class String
{
public:
String()
{
m_str = new char[16];
cap = 15;
}
String(const char *str);
String(int n, char c);
String(const String &str);
~String();
const char &at(int n);
bool empty() const;
int capacity() const { return cap; }
int length() const { return strlen(m_str); }
void expand(int n);
void resize(int len, char c);
String &assign(const String &s);
String &assign(const String &s, int n);
String &assign(const String &s, int n, int len);
String &append(const char *s);
String &append(const String &s, int len);
String &append(const String &s, int n, int len);
int find(char c, int pos);
String substr(int start, int n) const;
void swap(String &s);
friend ostream &operator<<(ostream &os, const String &s1);
friend istream &operator>>(istream &is, String &str);
String &operator=(const String &str);
bool operator==(String &s);
bool operator!=(String &s);
char operator[](int n);
private:
char *m_str;
int cap;
};
String::String(const char *str)
{
if (strlen(str) <= 15)
{
cap = 15;
m_str = new char[16];
}
else
{
cap = strlen(str) + 1;
m_str = new char[cap];
}
strcpy(m_str, str);
}
String::String(int n, char c)
{
if (n <= 15)
{
cap = 15;
m_str = new char[16];
}
else
{
cap = n + 1;
m_str = new char[cap];
}
for (int i = 0; i < n; i++)
{
m_str[i] = c;
}
m_str[n] = '\0';
}
String::String(const String &str) : m_str(NULL)
{
if (strlen(str.m_str) <= 15)
{
cap = 15;
m_str = new char[16];
}
else
{
cap = strlen(str.m_str) + 1;
m_str = new char[cap];
}
strcpy(m_str, str.m_str);
}
String::~String()
{
if (m_str != NULL)
{
delete[] m_str;
m_str = NULL;
}
}
ostream &operator<<(ostream &os, const String &s1)
{
os << s1.m_str;
return os;
}
istream &operator>>(istream &is, String &str)
{
char tmp[1024];
cin >> tmp;
int l1 = strlen(tmp) + 6;
if (str.cap == 0)
{
str.m_str = new char[l1];
}
if (str.cap < l1)
{
str.expand(l1 - str.cap);
}
strcpy(str.m_str, tmp);
return is;
}
String &String::operator=(const String &str)
{
if (m_str != nullptr)
{
delete[] m_str;
}
m_str = new char[str.cap];
cap = str.cap;
strcpy(m_str, str.m_str);
}
bool String::empty() const
{
if (m_str == NULL)
{
return true;
}
else
{
return false;
}
}
const char &String::at(int n)
{
if (n > strlen(m_str))
{
cout << "超出范围!" << endl;
return m_str[strlen(m_str)];
}
else
{
return m_str[n];
}
}
void String::expand(int n)
{
cap = cap + n;
char *str = new char[cap + 1];
strcpy(str, m_str);
delete[] m_str;
m_str = str;
str = NULL;
}
void String::resize(int len, char c)
{
if (len >= strlen(m_str))
{
int temp = strlen(m_str);
expand(len - temp);
for (int i = temp; i < len; i++)
{
m_str[i] = c;
}
}
else
{
char *str = new char[len + 1];
strcpy(str, m_str);
delete[] m_str;
m_str = str;
str = NULL;
}
m_str[len] = '\0';
}
String &String::assign(const String &s)
{
this->m_str = new char[strlen(s.m_str) + 1];
strcpy(m_str, s.m_str);
}
String &String::assign(const String &s, int n)
{
int len = strlen(s.m_str) - n;
m_str = new char[len + 1];
for (int j = 0; j < len + 1; j++)
{
m_str[j] = s.m_str[n + j];
}
m_str[len] = '\0';
}
String &String::assign(const String &s, int n, int len)
{
m_str = new char[len + 1];
for (int j = 0; j < len + 1; j++)
{
m_str[j] = s.m_str[n + j];
}
m_str[len] = '\0';
}
String &String::append(const char *s)
{
int i = strlen(m_str);
int len = strlen(s);
expand(len);
for (int j = 0; j < len; j++)
{
m_str[i + j] = s[j];
}
m_str[i + len] = '\0';
}
String &String::append(const String &s, int len)
{
int i = strlen(m_str);
if (len > strlen(s.m_str))
len = strlen(s.m_str);
expand(len);
for (int j = 0; j < len; j++)
{
m_str[i + j] = s.m_str[j];
}
m_str[i + len] = '\0';
}
String &String::append(const String &s, int n, int len)
{
int i = strlen(m_str);
if ((len + n) > strlen(s.m_str))
len = strlen(s.m_str) - n;
expand(len);
for (int j = 0; j < len; j++)
{
m_str[i + j] = s.m_str[j + n];
}
m_str[i + len] = '\0';
}
int String::find(char c, int pos = 0)
{
int n = 0;
int len = strlen(m_str);
for (int i = pos; i < len; i++)
{
if (c == m_str[i])
{
n = i + 1;
return n;
}
}
if (n == 0)
{
cout << "未在当前字符串中发现该字符!" << endl;
}
}
String String::substr(int start, int n) const
{
String s1;
s1.assign(*this, start, n);
return s1;
}
bool String::operator==(String &s)
{
if (strcmp(this->m_str, s.m_str) == 0)
{
return true;
}
else
{
return false;
}
}
bool String::operator!=(String &s)
{
if (strcmp(this->m_str, s.m_str) == 0)
{
return false;
}
else
{
return true;
}
}
void String::swap(String &s)
{
char *temp = m_str;
m_str = s.m_str;
s.m_str = temp;
int count = cap;
cap = s.cap;
s.cap = count;
}
char String::operator[](int n)
{
return *(m_str + n);
}
int main()
{
String s1;
s1 = "helloworld!";
cout << s1 << endl;
cout << s1.empty() << endl;
cout << s1.at(1) << endl;
cout << s1.length() << endl;
cout << s1.capacity() << endl;
s1.resize(15, '0');
cout << s1 << endl;
String s2;
s2.assign(s1);
cout << s2 << endl;
String s3;
s3.assign(s1, 5);
cout << s3 << endl;
String s4;
s4.assign(s1, 5, 5);
cout << s4 << endl;
s1.append(" vscode");
cout << s1 << endl;
s1.append(s4, 0, 5);
cout << s1 << endl;
s1.swap(s4);
cout << s1 << endl;
cout << s4 << endl;
s1 = s4.substr(7, 3);
cout << s1 << endl;
cout << s4.find('o') << endl;
cout << (s1 == s4) << endl;
cout << (s1 != s4) << endl;
cout << s4[3] << endl;
return 0;
}