#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <assert.h>
#include <iomanip>
using namespace std;
class String {
private:
char* str = NULL; //指向字符串的指针
int len; //字符串的长度
//static int num_string; //静态成员变量,用来统计程序中的String对象个数
static const int CINLIM = 50; //常静态成员变量,只能在定义时初始化。字符串输入的最大数值
public:
String(const char* s); //有参构造函数
String(); //无参构造函数
String(const String& string); //复制构造函数
~String(); //析构函数
int getLength() const; //返回string的长度
char* getString() const; //获得字符串
/*String类中的部分成员函数*/
String substr(int begin, int num); //从begin开始到num个字符组成的子串
void swap(String& string); //交换
int find(String& s); //寻找s字符串
String& erase(int begin); //删除begin后面的元素
/*运算符重载*/
String& operator = (const String& string); //赋值
String& operator = (const char*); //赋值
char& operator[](int i); //求字符串某个下标的字符
const char& operator [](int i) const; //求字符串某个下标的字符
String& operator+=(String& s); //重载+运算符连接
String& operator+=(const char* s); //把字符串s连接到当前字符串的结尾
/*重载友元函数*/
friend bool operator < (const String& string1, const String& string2); //比较
friend bool operator > (const String& string1, const String& string2);
friend bool operator == (const String& string1, const String& string2);
friend ostream& operator << (ostream& os, const String& string); //输出
friend istream& operator >> (istream& is, String& string); //输入
};
String::String(const char* s) {
len = strlen(s);
str = new char[len + 1];
assert(str != 0);
strcpy(str, s);
//num_string++;
}
String::String() {
len = 0;
str = new char[1];
assert(str != 0);
str[0] = '\0';
//num_string++;
}
String::String(const String& string) {
this->len = string.len;
str = new char[this->len + 1];
assert(str != 0);
strcpy(str, string.str);
//num_string++;
}
String::~String() {
if (str)
delete[] str;
//num_string--;
}
int String::getLength() const {
return len;
}
char* String::getString() const {
return this->str;
}
String String::substr(int begin, int num) {
char* ptr = new char[num + 1];
for (int i = 0; i < num; i++) {
ptr[i] = this->str[begin + i];
}
ptr[num + 1] = '\0';
return String(ptr);
}
void String::swap(String& string) {
char* ptr = str;
str = string.str; //已经对等号运算符进行了重载
string.str = ptr;
}
/*KMP*/
int* getNext(String p)
{
int* next = new int[p.getLength()];
next[0] = -1;
int j = 0;
int k = -1;
while (j < (int)p.getLength() - 1) {
if (k == -1 || p[j] == p[k]) {
j++;
k++;
next[j] = k;
}
else {
k = next[k];
}
}
return next;
}
int KMP(String& str1, String& str2)
{
int i = 0;
int j = 0;
int* next = getNext(str1);
while (i < (int)str1.getLength() && j < (int)str2.getLength())
{
if (j == -1 || str1[i] == str2[j]) {
i++;
j++;
}
else {
j = next[j];
}
}
if (j == (int)str2.getLength())
{
return i - j;
}
if (next) delete[]next;
return -1;
}
int String::find(String& s) {
return KMP(*this, s);
}
String& String::erase(int begin) {
char* ptr = new char[begin + 1];
assert(ptr != 0);
strncpy(ptr, this->str, begin);
ptr[begin] = '\0';
if (this->str) delete[]this->str;
this->str = ptr;
this->len = begin;
return *this;
}
/*运算符重载*/
String& String::operator=(const String& string) {
if (this == &string) {
return *this; //
}
else {
if (str) {
delete[] str;
len = string.len;
str = new char[len + 1];
assert(str != 0);
strcpy(str, string.str);
return *this;
}
else {
cout << "error" << endl;
exit(0);
}
}
}
String& String::operator=(const char* s) {
if (str) {
delete[] str;
len = strlen(s);
str = new char[len + 1];
assert(str != 0);
strcpy(str, s);
return *this;
}
else {
cout << "error" << endl;
exit(0);
}
}
String& String::operator+=(String& s) {
if (s.len > 0) {
int new_len = this->len + s.len + 1;
char* tmp = new char[new_len];
memset(tmp, 0, new_len); //全部置为0
if (tmp != NULL) {
strcpy(tmp, this->str);
}
strcat(tmp, s.str);
if (this->str) delete[]this->str;
this->str = tmp;
this->len = new_len;
}
return *this;
}
String& String::operator+=(const char* s) {
if (strlen(s) > 0) {
int new_len = this->len + strlen(s) + 1;
char* tmp = new char[new_len];
memset(tmp, 0, new_len); //全部置为0
if (tmp != NULL) {
strcpy(tmp, this->str);
}
strcat(tmp, s);
if (this->str) delete[]this->str;
this->str = tmp;
this->len = new_len;
}
return *this;
}
char& String::operator[](int i) {
return str[i]; //return i[str]
}
const char& String::operator[](int i)const {
return str[i];
}
bool operator<(const String& string1, const String& string2) {
return (strcmp(string1.str, string2.str) < 0);
}
bool operator>(const String& string1, const String& string2) {
return (strcmp(string1.str, string2.str) > 0);
}
bool operator==(const String& string1, const String& string2) {
return (strcmp(string1.str, string2.str) == 0);
}
ostream& operator<<(ostream& os, const String& string) {
os << string.str;
return os;
}
istream& operator >> (istream& is, String& string) {
char tmp[String::CINLIM];
is.get(tmp, String::CINLIM);
if (is)
string = tmp;
while (is && is.get() != '\n') {
continue;
}
return is;
}
int main()
{
String a("dyx");
String b("dwy");
cout << (a > b) << endl;
cout << (a < b) << endl;
String c("xyz");
c = a;
cout << c << endl;
cout << !(a == b) << endl;
a += b;
cout << a << endl;
return 0;
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交