Files
2024-03-17 22:30:49 +08:00

195 lines
3.7 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 模仿c++ 自带string类,设计一个字符串类SString,要求至少有以下功能:
// (1)字符串初始化
// (2)字符串类对象能相互赋值(重载运算符 =)
// (3)获得字符串长度
// (4)字符串连接,通过重载运算符 + 实现
// (5)字符串显示功能
// (6)字符串插入功能
// (7)字符串删除功能
// (8)取子串功能
// (9)字符串查找功能
// (10)字符串比较功能,重载运算符 ==
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 2;
class SString {
private:
char *p;
int len;
public:
SString();
SString(const char *s);
SString(const SString &s);
~SString();
SString &operator=(const char *s);
SString &operator=(const SString &s);
SString operator+(const char *s) const;
SString operator+(const SString &s) const;
bool operator==(const char *s) const;
bool operator==(const SString &s) const;
int length() const;
void insert(int pos, const char *s);
void insert(int pos, const SString &s);
void erase(int pos, int n);
SString substr(int pos, int n) const;
int find(const char *s) const;
int find(const SString &s) const;
friend ostream &operator<<(ostream &out, const SString &s);
friend istream &operator>>(istream &in, SString &s);
};
ostream &operator<<(ostream &out, const SString &s);
SString::SString() {
p = nullptr;
len = 0;
}
SString::SString(const char *s) {
len = strlen(s);
p = new char[len + 1];
strcpy(p, s);
}
SString::SString(const SString &s) {
len = s.len;
p = new char[len + 1];
strcpy(p, s.p);
}
SString::~SString() {
delete[] p;
}
SString &SString::operator=(const char *s) {
if (p != s) {
delete[] p;
len = strlen(s);
p = new char[len + 1];
strcpy(p, s);
}
return *this;
}
SString &SString::operator=(const SString &s) {
if (this != &s) {
delete[] p;
len = s.len;
p = new char[len + 1];
strcpy(p, s.p);
}
return *this;
}
SString SString::operator+(const char *s) const {
SString temp;
temp.len = len + strlen(s);
temp.p = new char[temp.len + 1];
strcpy(temp.p, p);
strcat(temp.p, s);
return temp;
}
SString SString::operator+(const SString &s) const {
return *this + s.p;
}
bool SString::operator==(const char *s) const {
return strcmp(p, s) == 0;
}
bool SString::operator==(const SString &s) const {
return *this == s.p;
}
int SString::length() const {
return len;
}
void SString::insert(int pos, const char *s) {
if (pos < 0 || pos > len) {
cerr << "Invalid position" << endl;
return;
}
int slen = strlen(s);
char *temp = new char[len + slen + 1];
strncpy(temp, p, pos);
strcpy(temp + pos, s);
strcpy(temp + pos + slen, p + pos);
delete[] p;
p = temp;
len += slen;
}
void SString::insert(int pos, const SString &s) {
insert(pos, s.p);
}
void SString::erase(int pos, int n) {
if (pos < 0 || pos >= len || n < 0 || n > len - pos) {
cerr << "Invalid arguments" << endl;
return;
}
char *temp = new char[len - n + 1];
strncpy(temp, p, pos);
strcpy(temp + pos, p + pos + n);
delete[] p;
p = temp;
len -= n;
}
SString SString::substr(int pos, int n) const {
if (pos < 0 || pos >= len || n < 0 || n > len - pos) {
cerr << "Invalid arguments" << endl;
return SString();
}
char *temp = new char[n + 1];
strncpy(temp, p + pos, n);
temp[n] = '\0';
SString result(temp);
delete[] temp;
return result;
}
int SString::find(const char *s) const {
char *pos = strstr(p, s);
if (pos == nullptr) {
return -1;
}
else {
return pos - p;
}
}
int SString::find(const SString &s) const {
return find(s.p);
}
ostream &operator<<(ostream &out, const SString &s) {
out << s.p;
return out;
}
istream &operator>>(istream &in, SString &s) {
char t[N];
in >> t;
s.len = strlen(t);
s.p = new char[s.len + 1];
strcpy(s.p, t);
return in;
}