模拟实现string的操作。运行结果:
#include <iostream>
using namespace std;
class MyString
{
//(1)
private:
char* mPtr; //字符指针
public:
//(2)对私有变量的读写
char* getPtr() { return mPtr; }
void setPtr( char* p) { mPtr = p; } //这里是浅拷贝
//(3)3个构造函数
MyString() { mPtr = 0; }
MyString(const char* p)
{
int len = 0;
int i = 0;
while (p[len] != '\0')
{
len++;
}
mPtr = new char[len + 1];
while (p[i] != '\0')
{
mPtr[i] = p[i];
i++;
}
mPtr[i] = '\0';
}
MyString(int n)
{
mPtr = new char[n];
}
//(4)拷贝构造函数
MyString(MyString& s)
{
if (mPtr)
{
delete[] mPtr;
}
int len = 0;
int i = 0;
while (s.mPtr[len] != '\0')
{
len++;
}
mPtr = new char[len + 1];
while (s.mPtr[i] != '\0')
{
mPtr[i] = s.mPtr[i];
i++;
}
mPtr[i] = '\0';
}
//赋值运算符重载
void operator=(const MyString& s)
{
if (mPtr)
{
delete[] mPtr;
}
int len = 0;
int i = 0;
while (s.mPtr[len] != '\0')
{
len++;
}
mPtr = new char[len + 1];
while (s.mPtr[i] != '\0')
{
mPtr[i] = s.mPtr[i];
i++;
}
mPtr[i] = '\0';
}
//(5)析构函数
~MyString()
{
if (mPtr != 0)
{
delete[] mPtr;
mPtr = 0;
}
}
//(6)求字符串长度
int length()
{
int len=0;
if (mPtr == 0) return 0;
while (mPtr[len] != '\0')
len++;
return len;
}
//(7)字符串拷贝
void copy(MyString &p)
{
if (mPtr != 0)
{
delete[] mPtr;
}
int len = 0;
int i = 0;
while (p.mPtr[len] != '\0')
{
len++;
}
mPtr = new char[len + 1];
while (p.mPtr[i] != '\0')
{
mPtr[i] = p.mPtr[i];
i++;
}
mPtr[i] = '\0';
}
//或者直接拷贝char*
void copy(const char* p)
{
int len = 0;
int i = 0;
if (mPtr != 0)
{
delete[] mPtr;
}
while (p[len] != '\0')
{
len++;
}
mPtr = new char[len + 1];
while (p[i] != '\0')
{
mPtr[i] = p[i];
i++;
}
mPtr[i] = '\0';
}
//(8)字符串查找
int find(const char* p)
{
int i = 0;
int j = 0;
if (mPtr == 0)
return -1;
for (i = 0; mPtr[i] != '\0'; i++)
{
for (j = 0; p[j] != '\0'; j++)
{
if (mPtr[i + j] == p[j])
continue;
else
break;
}
if (p[j] == '\0')
return i;
}
return -1;
}
//(9)插入
char* insert(int pos, const char* p)
{
int len = length(); //计算当前串的长度
int l2 = 0;
if (pos < 0 || p == 0) return mPtr;
if (pos >= len) return mPtr; //位置错误
while (p[l2])
{
l2++;
}
if (len == 0 || mPtr == 0)
{
mPtr = new char[l2 + 1];
int i = 0;
while (p[i])
{
mPtr[i] = p[i];
i++;
}
mPtr[i] = 0;
return mPtr;
}
//
char* ptmp = new char[len + l2 + 1];
int k = 0;
int j = 0;
//复制pos之前的数据
for (k = 0; k < pos; k++)
ptmp[k] = mPtr[k];
//复制p中的数据
for (j = 0; p[j] != '\0'; j++)
{
ptmp[k] = p[j];
k++;
}
//复制pos之后的数据
for (j = 0; mPtr[j + pos] != '\0'; j++)
{
ptmp[k] = mPtr[j + pos];
k++;
}
ptmp[k] = 0;
//释放原来的空间
delete[] mPtr;
mPtr = ptmp;
ptmp = 0;
return mPtr;
}
};
//(10)
int main()
{
const char* p = "abcde";
const char* p2 = "1234567890";
//3种构造方法
MyString s1;
MyString s2(p);
MyString s3(10);
//拷贝构造函数
MyString s4(s2);
//赋值运算符
MyString s5;
s5 = s4;
cout << s5.getPtr() <<"的长度为:" << s5.length() << endl; //输出s5的长度
//调用拷贝函数
s5.copy(p2);
cout << "调用copy函数拷贝1234567890后,s5的内容:" << s5.getPtr() << endl; //输出拷贝后的字符串
int index = s5.find("00");
if (index == -1)
cout << "00不在" << s5.getPtr() << "中" << endl;
else
cout << "00在" << s5.getPtr() << "的下标:" << index << endl;
index = s5.find("234");
if (index == -1)
cout << "234不在" << s5.getPtr() << "中" << endl;
else
cout << "234在" << s5.getPtr() << "的下标:" << index << endl;
//插入
cout << s5.getPtr() << "在下标2处插入xxx后的字符串是:";
const char* p3 = "xxx";
cout << s5.insert(2, p3) << endl;
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!