字符串是一种常用的数据类型,现在我们将其常用的功能用代码实现如下:
class String
{
char* ptr;
int len;
public:
/*********************************无参构造*********************************/
String() {
ptr = new char[1]{'\0'};
len = 0;
}
/*********************************拷贝构造*********************************/
String(const char* s) {
cout << "const char* "<< endl;
len = strlen(s);
ptr = new char[len+1];
memcpy(ptr, s, len+1);
}
/*********************************拷贝构造*********************************/
String(char c, int n) {
len = n;
ptr = new char[n+1]{};
memset(ptr, c, n);
}
//const String& 拷贝构造函数的原型,
//1,引用可以改变实参,不应该改变实参的内容
//2,const & 可以引用右值(匿名变量)
/*********************************拷贝构造*********************************/
String(const String& s) {
cout << "copy " << endl;
len = s.len;
ptr = new char[s.len+1]{};
memcpy(ptr, s.ptr, len);
}
/*********************************字符串长度*********************************/
int size() {
return len;
}
/*********************************判断字符串是否为空*********************************/
bool empty() {
return len == 0;
}
/*********************************字符串首地址*********************************/
const char* c_str() {
return ptr;
}
/*********************************字符串长度重置*********************************/
void resize(int n) {
char* p = new char[n+1]{};
memcpy(p, ptr, n);
delete [] ptr;
ptr = p;
len = n;
}
// ptr = "hello"
// hlo
// p = "000"
// 1, 2
/*********************************字符串删除*********************************/
void erase(int pos, int n) {
if (pos < 0 || pos >= len) {
cout << "超出范围" << endl;
abort();
}
if (n < 0) {
cout << "长度小于0" << endl;
abort();
}
n = n > len - pos ? len - pos : n;
char* p = new char[len-n+1]{};
memcpy(p, ptr, pos);
memcpy(p+pos, ptr+pos+n, len-pos-n);
delete [] ptr;
ptr = p;
len = len - n;
}
/*********************************字符串头插入*********************************/
void insert(int pos, const char* s) {
replace(pos, 0, s);
}
// "he\0llo"
/*********************************字符串任意插入*********************************/
void insert(int pos, const String& s) {
replace(pos, 0, s);
}
/*
pos+n
| |
// ptr = "hello", s = "world"
--
// 1, 2
// ptr = "hworldlo";
-----
*/
/*********************************字符串任意插入*********************************/
void replace(int pos, int n, const String& s) {
if (pos < 0 || pos >= len) {
cout << "超出范围" << endl;
abort();
}
if (n < 0) {
cout << "长度小于0" << endl;
abort();
}
n = n > len - pos ? len - pos : n;
int sl = s.len; //String类型的长度不能用strlen测量
char* p = new char[len+sl-n+1]{};
memcpy(p, ptr, pos);
memcpy(p+pos, s.ptr, sl);
memcpy(p+pos+sl, ptr+pos+n, len-pos-n);
len = sl + len - n;
delete [] ptr;
ptr = p;
}
/*********************************字符串任意替换*********************************/
void replace(int pos, int n, const char* s) {
if (pos < 0 || pos >= len) {
cout << "超出范围" << endl;
abort();
}
if (n < 0) {
cout << "长度小于0" << endl;
abort();
}
n = n > len - pos ? len - pos : n;
int sl = strlen(s);
char* p = new char[len+sl-n+1]{};
memcpy(p, ptr, pos);
memcpy(p+pos, s, sl);
memcpy(p+pos+sl, ptr+pos+n, len-pos-n);
len = sl + len - n;
delete [] ptr;
ptr = p;
}
/*********************************字符串查找*********************************/
String substr(int pos, int n) {
// ptr[pos] ~ ptr[pos+n-1]
if (pos < 0 || pos >= len) {
cout << "超出范围" << endl;
abort();
}
if (n < 0) {
cout << "长度小于0" << endl;
abort();
}
n = n > len - pos ? len - pos : n;
char* p = new char[n+1];
memcpy(p, ptr+pos, n);
String t;
delete [] t.ptr;
t.ptr = p;
t.len = n;
return t;
}
void show() {
cout << (void*)ptr << " ";
for (int i=0; i<len; i++)
cout << ptr[i];
cout << endl;
}
String show(String s) {
s.show();
String t("banana");
return t;
}
//析构函数
~String() {
cout << "delete " << ptr <<endl;
delete [] ptr;
}
};