目录
功能要求:
功能1.0
初步实现MyString类(数据属性包括char * list,int length(字符串长度))
1.1. 实现构造函数(通过字符串初始化list)
1.2. 析构函数
1.3. 字符串拼接
1.4. 字符串比较大小(实现strcmp功能)
1.5. 子串查找
1.6. 提取某个位置字符
1.7. 输出。
功能2.0
2.1. 转换构造函数的使用(系统自动调用)
2.2. 给MyString对象数组赋值
2.3. 返回字符串长度
2.4. 重载 = 运算符
2.5. 重载 += 运算符
2.6. 重载 ! 运算符
2.7. 重载 == 运算符
2.8. 重载 < 运算符
2.9. 重载 != 运算符
2.10. 重载 > 运算符
2.11. 重载 <= 运算符
2.12. 重载 >= 运算符
2.13. 重载 [] 运算符
2.14. 重载 () 运算符
2.15. 流输入>>和流输出<<运算符的重载
代码实现:
功能1.0:
MyString.h:
#pragma once
#ifndef MYTSTRING_H
#define MYTSTRING_H
class MyString
{
private:
char* List;
int length;
public:
MyString(const char* p_list = "");
MyString& Cont(const MyString&);
char atIndex(int);
void MyStrcmp( MyString);
void find( MyString,int pos=0);
void print() const;
~MyString();
};
#endif // !MYTSTRING_H
MyString.cpp:
#include "MyString.h"
#include<iostream>
using namespace std;
MyString::MyString(const char* p_list )
{
length = 0;
const char* p = p_list;
while (*p)
{
length++;
p++;
}
List = new char[length + 1];
p = p_list;
int i = 0;
while (*p)
{
//*List = *p;
List[i] = *p;
i++;
//List++;
p++;
}
List[length] = '\0';
}
MyString& MyString::Cont(const MyString& a)
{
int newlength = this->length + a.length;
char* templist = new char[newlength +1];
const char* p = List;
char* r = templist;
while (*p)
{
*r = *p;
r++;
p++;
}
const char* q = a.List;
while (*q)
{
*r = *q;
r++;
q++;
}
templist[newlength] = '\0';
delete[]List;
List = templist;
length = newlength;
//delete[]templist;
return *this;
}
char MyString::atIndex(int i)
{
if (i < 0 || i >= length)
return ' ';
else
return List[i];
}
void MyString::MyStrcmp( MyString b)
{
int flag = 0;
if (this->length <= b.length)
{
for (int i = 0; i < length; i++)
{
if (*(List + i) > b.List[i])
{
flag = 1;
break;
}
else if (*(List + 1) < b.List[i])
{
flag = 2;
break;
}
}
}
else
{
flag = 1;
for (int i = 0; i < b.length; i++)
{
if (*(List + i) > b.List[i])
{
flag = 1;
break;
}
else if (*(List + 1) < b.List[i])
{
flag = 2;
break;
}
}
}
if (flag == 0)
{
print();
cout<< " is equal to ";
b.print();
cout << endl;
}
else if (flag == 1)
{
print();
cout << " is greater than ";
b.print();
cout << endl;
}
else if (flag == 2)
{
print();
cout << " is less than ";
b.print();
cout << endl;
}
}
void MyString::find(MyString a, int pos)
{
int cnt = 0;
int pos_=pos;
int num = 0;
if (a.length > this->length)
{
cout << "Invalid string" << endl;
return;
}
for (int i = pos; i < this->length; i++)
{
if (num == 3)
{
cnt++;
num = 0;
cout << "字串出现的起始位置:" << pos_ << endl;
}
if (num == 0)
pos_ = i;
if ( *(List + i) == a.List[num])
{
num++;
}
else
{
num = 0;
}
}
cout << "字串出现次数:" << cnt<<endl;
}
void MyString::print() const
{
for (int i = 0; i < length; i++)
cout << List[i];
}
MyString::~MyString()
{
delete[] List;
}
功能2.0:
实现过程中遇到的问题:
1. 在类中设置友元后却无法访问类中私有对象,如下图
解决方法:
此时可以正常访问私有对象
2. 之所以要分别设置指针进行拼接,是为了防止templist指向字符串末尾,导致调用后越界
const MyString& MyString::operator+=(const MyString& a)
{
int newlength = this->length + a.length;
char* templist = new char[newlength + 1];
const char* p = List;
char* r = templist;
while (*p)
{
*r = *p;
r++;
p++;
}
const char* q = a.List;
while (*q)
{
*r = *q;
r++;
q++;
}
templist[newlength] = '\0';
delete[]List;
List = templist;
length = newlength;
//delete[]templist;
return *this;
}
3.发现了一个易错点,上面[]重载可能会改变对象的值,所以直接return ‘ ’会报错
但下面代码有const,不会导致对象被更改,所以可以返回‘ ’
char& MyString::operator[](int i)
{
if (i < 0 || i >= length)
exit(1);//退出整个程序,返回值为1
else
return List[i];
}
char MyString::operator[](int i)const
{
if (i < 0 || i >= length)
return ' ';
else
return List[i];
}
MyString.h:
Private:
void setString(const char*);
public:
int getLength()const;
const MyString& operator=(const MyString&);
const MyString& operator+=(const MyString&);
bool operator!()const;
bool operator==(const MyString&)const;
bool operator<(const MyString&)const;
bool operator!=(const MyString&)const;
bool operator>(const MyString&)const;
bool operator<=(const MyString&)const;
bool operator>=(const MyString&)const;
char& operator[](int);
char operator[](int)const;
MyString operator()(int, int = 0)const;
friend std::ostream &operator<<(std::ostream&, const MyString&);
friend std::istream &operator>>(std::istream&, MyString&);
MyString.cpp:
void MyString::setString(const char*a)
{
List = new char[length + 1];
if (a != 0)
{
for (int i = 0; i <= length; i++)
{
List[i] = a[i];
}
}
else
List[0] = '\0';
}
const MyString& MyString::operator=(const MyString& a)
{
if (this != &a)
{
delete[]List;
length = a.length;
setString(a.List);
}
}
const MyString& MyString::operator+=(const MyString& a)
{
int newlength = this->length + a.length;
char* templist = new char[newlength + 1];
const char* p = List;
char* r = templist;
while (*p)
{
*r = *p;
r++;
p++;
}
const char* q = a.List;
while (*q)
{
*r = *q;
r++;
q++;
}
templist[newlength] = '\0';
delete[]List;
List = templist;
length = newlength;
//delete[]templist;
return *this;
}
完整版源代码:
MyString.h:
#pragma once
#include<iostream>
#ifndef MYTSTRING_H
#define MYTSTRING_H
class MyString
{
friend std::ostream &operator<<(std::ostream&, const MyString&);
friend std::istream &operator>>(std::istream&, MyString&);
public:
MyString(const char* p_list = "");
MyString& Cont(const MyString&);
char atIndex(int);
void MyStrcmp(MyString&);
void find(MyString&, int pos = 0);
void print() const;
~MyString();
const MyString& operator=(const MyString&);
const MyString& operator+=(const MyString&);
bool operator!()const;
bool operator==(const MyString&)const;
bool operator<(const MyString&)const;
bool operator!=(const MyString&)const;
bool operator>(const MyString&)const;
bool operator<=(const MyString&)const;
bool operator>=(const MyString&)const;
char& operator[](int);
char operator[](int)const;
MyString operator()(int, int = 0)const;
int getLength()const;
MyString(const MyString&);
private :
char* List;
int length;
void setString(const char*);
};
#endif // !MYTSTRING_H
MyString.cpp:
#include "MyString.h"
#include<iostream>
using namespace std;
MyString::MyString(const char* p_list)
{
length = 0;
const char* p = p_list;
while (*p)
{
length++;
p++;
}
List = new char[length + 1];
p = p_list;
int i = 0;
while (*p)
{
//*List = *p;
List[i] = *p;
i++;
//List++;
p++;
}
List[length] = '\0';
}
MyString& MyString::Cont(const MyString& a)
{
int newlength = this->length + a.length;
char* templist = new char[newlength + 1];
const char* p = List;
char* r = templist;
while (*p)
{
*r = *p;
r++;
p++;
}
const char* q = a.List;
while (*q)
{
*r = *q;
r++;
q++;
}
templist[newlength] = '\0';
delete[]List;
List = templist;
length = newlength;
//delete[]templist;
return *this;
}
char MyString::atIndex(int i)
{
if (i < 0 || i >= length)
return ' ';
else
return List[i];
}
void MyString::MyStrcmp(MyString& b)
{
int flag = 0;
if (this->length <= b.length)
{
for (int i = 0; i < length; i++)
{
if (*(List + i) > b.List[i])
{
flag = 1;
break;
}
else if (*(List + 1) < b.List[i])
{
flag = 2;
break;
}
}
}
else
{
flag = 1;
for (int i = 0; i < b.length; i++)
{
if (*(List + i) > b.List[i])
{
flag = 1;
break;
}
else if (*(List + 1) < b.List[i])
{
flag = 2;
break;
}
}
}
if (flag == 0)
{
print();
cout << " is equal to ";
b.print();
cout << endl;
}
else if (flag == 1)
{
print();
cout << " is greater than ";
b.print();
cout << endl;
}
else if (flag == 2)
{
print();
cout << " is less than ";
b.print();
cout << endl;
}
}
void MyString::find(MyString& a, int pos)
{
int cnt = 0;
int pos_ = pos;
int num = 0;
if (a.length > this->length)
{
cout << "Invalid string" << endl;
return;
}
for (int i = pos; i < this->length; i++)
{
if (num == 3)
{
cnt++;
num = 0;
cout << "字串出现的起始位置:" << pos_ << endl;
}
if (num == 0)
pos_ = i;
if (*(List + i) == a.List[num])
{
num++;
}
else
{
num = 0;
}
}
cout << "字串出现次数:" << cnt << endl;
}
void MyString::print() const
{
for (int i = 0; i < length; i++)
cout << List[i];
}
MyString::~MyString()
{
delete[] List;
}
void MyString::setString(const char*a)
{
List = new char[length + 1];
if (a != 0)
{
for (int i = 0; i <= length; i++)
{
List[i] = a[i];
}
}
else
List[0] = '\0';
}
const MyString& MyString::operator=(const MyString& a)
{
if (this != &a)
{
delete[]List;
length = a.length;
setString(a.List);
}
return *this;
}
const MyString& MyString::operator+=(const MyString& a)
{
int newlength = this->length + a.length;
char* templist = new char[newlength + 1];
const char* p = List;
char* r = templist;
while (*p)
{
*r = *p;
r++;
p++;
}
const char* q = a.List;
while (*q)
{
*r = *q;
r++;
q++;
}
templist[newlength] = '\0';
delete[]List;
List = templist;
length = newlength;
//delete[]templist;
return *this;
}
bool MyString::operator!()const
{
return length == 0;
}
//当字符串为空时,length=0,所以length==0为真,return 1;反之return 0
bool MyString::operator==(const MyString& a)const
{
if (length == a.length)
{
for (int i = 0; i < length; i++)
{
if (List[i] != a.List[i])
return 0;
}
return 1;
}
return 0;
}
bool MyString::operator<(const MyString& b)const
{
int flag = 0;
if (this->length <= b.length)
{
for (int i = 0; i < length; i++)
{
if (*(List + i) > b.List[i])
{
flag = 1;
break;
}
else if (*(List + 1) < b.List[i])
{
flag = 2;
break;
}
}
}
else
{
flag = 1;
for (int i = 0; i < b.length; i++)
{
if (*(List + i) > b.List[i])
{
flag = 1;
break;
}
else if (*(List + 1) < b.List[i])
{
flag = 2;
break;
}
}
}
if (flag == 2)
return 1;
return 0;
}
bool MyString::operator!=(const MyString& a)const
{
return !(*this == a);
}
bool MyString::operator>(const MyString& a)const
{
return a < *this;
}
bool MyString::operator<=(const MyString& a)const
{
return !(a < *this);
}
bool MyString::operator>=(const MyString& a)const
{
return !(*this < a);
}
//重载过==和<后,即可应用;
char& MyString::operator[](int i)
{
if (i < 0 || i >= length)
exit(1);//退出整个程序,返回值为1
else
return List[i];
}
char MyString::operator[](int i)const
{
if (i < 0 || i >= length)
return ' ';
else
return List[i];
}
MyString MyString::operator()(int pos, int n)const
{
if (pos < 0 || pos >= length||n<0)
{
cout << "error inpot" << endl;
return "";
}
int len ;
if (n == 0 || n + pos > length)
len = length - pos;
else len = n;
char* temp = new char[len + 1];
for (int i = 0; i < len; i++)
{
temp[i] = List[pos + i];
}
temp[len] = '\0';
MyString Temp(temp);
delete[]temp;
return Temp;
}
int MyString::getLength()const
{
return length;
}
MyString::MyString(const MyString& a)
{
length = a.length;
List= new char[length+1];
for (int i = 0; i <= length; i++)
List[i] = a.List[i];
}
ostream& operator<<(ostream& cout, const MyString& a)
{
cout << a.List;
return cout;
}
istream& operator>>(istream& cin, MyString& a)
{
char temp[100];
cin >> temp;
a = temp;
return cin;
}
源.cpp:
#include<iostream>
#include"MyString.h"
using namespace std;
int main()
{
MyString str1("Hello ");
MyString str2("World");
MyString str3;
cout << boolalpha << "The results of comparing str2 and str1:";
cout << "\nstr2==str1 yields " << (str2 == str1)
<< "\nstr2!=str1 yields " << (str2 != str1)
<< "\nstr2>str1 yields " << (str2 > str1)
<< "\nstr2<str1 yields " << (str2 < str1)
<< "\nstr2>=str1 yields " << (str2 >= str1)
<< "\nstr2<=str1 yields " << (str2 <= str1);
if (!str3)
{
str3 = str1;
str1 += str2;
cout << "\n\nstr1+=str2 yields " << str1;
cout << "\n\nstr1+=\"!!!\"yields " << endl;
str1 += "!!!";
cout << "str1=" << str1 << "\n\n";
cout << "\n\nThe substring of str1 strating at\n"
<< "location 0 for 6 characters str1(0,6) ,is:\n"
<< str1(0, 6) << "\n\n";
cout << "The substring of str1 strating at\n" << str1(8) << "\n\n";
MyString* str4 = new MyString(str1);
cout << "\n*str4=" << *str4;
cout << "\nassigning *str4 to *str4";
cout << "\n*str4=" << *str4 << endl;
delete str4;
str1[0] = 'H';
str1[7] = 'W';
}
return 0;
}
应用到的一些小技巧:
1. 使用了boolalpha将bool解析成为true或者 false。
便于观察运行结果
注意:当使用boolalpha后,以后的bool类型结果都将以true或false形式输出,除非使用noboolalpha取消 boolalpha流的格式标志。