1、初学 C++ 的作业:设计一个叫做String的类,要求该类能够完成以下功能:
(1) 构造函数能够根据实际传入的参数分配实际存储空间;缺省时为100字节;
(2) 析构函数释放该空间;
(3) 编写成员函数Assign,可以将一个字符串赋值给该类;
(4) 编写成员函数Disp,可以将该类的内容打印到屏幕上;
(5) 编写成员函数Replace,用于替换某一指定的字符串;
(6) 编写成员函数Append,用于向已有的数据后面添加数据;
(7) 编写成员函数Size,用于得到当前数据的真实长度。
2、头文件##
#include <iostream>
using namespace std;
class MyString{
public:
/*
* @brief 构造函数
*/
MyString();
MyString(char *str);
~MyString();
/*
* @brief 打印字符串内容
*/
void Disp();
/*
* @brief 整体替换字符串
* @param str 要替换的字符串
*/
void Assign(char *str);
/*
* @brief 查找并替换子串
* @param str1 查找的子串
* @param str2 替换的子串
*/
void Replace(char *str1, char *str2);
/*
* @brief 追加(连接)字符串
* @param 要追加的字符串
*/
void Append(char *str);
/*
* @brief 查询字符串占用的空间
* @return int 空间大小,字节
*/
int Size();
/*
* @brief 查询字符串的长度,不包括结束符
* @return int 字符串长度
*/
int Length();
protected:
char *str;
int size = 0;
};
3、.cpp##
#include <iostream>
using namespace std;
#include "mystring.h"
#define DEFLEN 100 //默认长度
/*
* @brief 查询子串
* @param index 开始查询位置
* @param str 字符串
* @param strn 子串
* @return int 查询到的位置,没有找到返回-1
*/
static int strindex(int index, char *str, char *strn);
/*
* @brief 查询字符串长度,不包括结束符
* @param str 字符串
* @return int 长度
*/
static int strlen(char *str);
/*
* @brief 字符串复制
* @param fromStr 源字符串
* @param toStr 目标字符串
* @param len 最大复制长度,-1不限制
*/
static void strcpy(char *fromStr, char *toStr, int len = -1);
MyString::MyString()
: str(new char[DEFLEN])
{
if(str != NULL)
size = DEFLEN;
else
size = 0;
}
MyString::MyString(char *str)
{
int l = strlen(str);
if(l == 0){
this->str = new char[DEFLEN];
if(this->str != NULL)
size = DEFLEN;
else//内存分配失败
size = 0;
return;
}
this->str = new char[l];
if(this->str != NULL)
size = DEFLEN;
else{//内存分配失败
size = 0;
return;
}
strcpy(str, this->str);
}
MyString::~MyString()
{
if(str == NULL)
return;
delete [] str;
str = NULL;
size = 0;
}
void MyString::Disp()
{
cout << str << endl;
}
void MyString::Assign(char *str)
{
this->~MyString();
int l = strlen(str);
if(l == 0){
this->str = new char[DEFLEN];
if(this->str != NULL)
size = DEFLEN;
else//内存分配失败
size = 0;
return;
}
this->str = new char[l];
if(this->str != NULL)
size = DEFLEN;
else{//内存分配失败
size = 0;
return;
}
strcpy(str, this->str);
}
void MyString::Replace(char *str1, char *str2)
{
int l1 = strlen(str1);
int l2 = strlen(str2);
int index = 0;
while(true)
{
int l = strindex(index, str, str1); //查找字串是否包含
if(l == -1) //没找到
break;
index = l+l2; //记录当前位置
int newlen = strlen(str) - l1 + l2; //计算新字符串的长度
char *temp = new char[newlen]; //分配空间
if(temp != NULL)
size = newlen;
else
{//内存分配失败
this->~MyString();
return;
}
strcpy(str, temp, l); //字串前面的部分复制
strcpy(str2, temp+l); //新字串复制
strcpy(str+l+l1, temp+l+l2); //字串后边部分复制
delete [] str; //销毁原来的字符串
str = temp; //复制新的字符串
}
}
void MyString::Append(char *str)
{
int len = strlen(str); //追加字符串长度
int slen = strlen(this->str); //原字符串长度
char *temp = new char[slen+len];
if(temp != NULL)
size = slen + len;
else
{//内存分配失败
this->~MyString();
return;
}
strcpy(this->str, temp);
strcpy(str, temp + slen);
delete [] this->str;
this->str = temp;
}
int MyString::Size()
{
//return sizeof(str); //error
return size;
}
int MyString::Length()
{
return strlen(str);
}
static int strindex(int index, char *str, char *strn)
{
int l = strlen(str);
int ln = strlen(strn);
for(int i = index; i < l - ln; i++)
{
for(int j = 0; j < ln; j++)
{
if(str[i+j] != strn[j])
break;
if(j == ln-1)
return i;
}
}
return -1;
}
static int strlen(char *str)
{
int len = 0;
if(str == NULL)
return len;
while(*str++ != '\0')
len++;
return len;
}
static void strcpy(char *fromStr, char *toStr, int len)
{
if(fromStr == NULL || toStr == NULL)
return;
int count = 0;
while(*fromStr != '\0')
{
*toStr++ = *fromStr++;
count++;
if(len != -1)
{
if(count >= len)
return;
}
}
}
4、mian.cpp###
#include <iostream>
using namespace std;
#include "mystring.h"
int main(int argc, char *argv[])
{
MyString str("Hello");
str.Disp();
//str.Assign("ggsgsk");
//str.Disp();
//str.Replace("gs", "g");
//str.Disp();
str.Append(" World!");
str.Disp();
cout << str.Size() << endl;
cout << str.Length()<< endl;
return 0;
}
运行