Mystring部分/多种实现方法。

本文详细介绍了如何使用C++实现自定义字符串类Mystring,包括构造函数、拷贝构造函数、运算符重载等功能,并展示了如何进行字符串连接、比较等操作。

这也是部分。

原地址:猴子技术宅---https://www.ctvol.com/c-cyuyankaifa/523968.html

#include "stdafx.h"
#include <cstdio>
//构造函数(默认)
Mystring::Mystring(const char* str = NULL){
	if (str == NULL){
		//开辟内存空间
		_str = new char[1];
		*_str = '\0';
	}
	else{
		int len = strlen(str);
		//加1为'\0'申请内存空间
		_str = new char[len + 1];
		//(_CHAR *_DEST, size_t _SIZE, const _CHAR *_SRC)能自动检测是否越界
		strcpy_s(_str, len + 1, str); 
	}
}
//拷贝构造函数
Mystring::Mystring(const Mystring & another){
	int len = strlen(another._str);
	_str = new char[len + 1];
	strcpy_s(_str, len + 1, another._str);
}
//运算符重载 =(赋值)
Mystring & Mystring::operator = (const Mystring & another){
	//自赋值,出现错误
	if(this == &another){
		return *this;
	}
	//先删除自己开辟的空间
	Mystring::~Mystring();
	//获取another字符长度
	int len = strlen(another._str);
	//开辟内存空间+1 '\0'
	this->_str = new char[len + 1];
	//将another数据赋值给开辟的空间里面
	strcpy_s(this->_str, len + 1, another._str);
	//*_str
	return *this; 
}
//运算符重载 +(加法)
Mystring Mystring::operator + (const Mystring & another){
	//第一种方法
	int len = strlen(this->_str) + strlen(another._str);
	//Mystring str;
	//delete []str._str;
	//str._str = new char[len + 1];
	//零时开辟空间
	char *p = new char[len +1];
	//将开辟的内存空间填充为0
	memset(p, 0, len + 1);
	//将目标字符串衔接到开辟的空间中
	strcat_s(p, strlen(this->_str) + 1 , this->_str);
	//源字符串长度+目标字符串长度+结束符
	int len_one = strlen(this->_str) + strlen(another._str) + 1;
	//int len_two = strlen(another._str) + 1;
	strcat_s(p, len_one, another._str);
	//http://blog.csdn.net/xiaobin_hlj80/article/details/20136283 
	//介绍strcat_s合并2个字符串
	return p;
	
	////第二种方法:
	//int i = 0, j =0;
	////计算长度
	//int len = strlen(this->_str) + strlen(another._str);
	////申请临时内存空间
	//char* p = new char[len+1];
	////将申请的内存空间填充为0
	//memset(p, 0, len + 1);
	////遍历赋值
	//while (this->_str[i] != '\0'){
	//	p[j++] = this->_str[i++];
	//}
	//cout << j <<endl;
	//i = 0;
	//while(another._str[i] != '\0'){
	//	p[j++] =another._str[i++];
	//}
	//return p;
}
//关系运算符重载 >
bool Mystring::operator > (const Mystring & another){
	if (strcmp(this->_str, another._str) > 0){
		return true;
	}
	else{
		return false;
	}
}
//关系运算符重载 <
bool Mystring::operator < (const Mystring & another){
	if(strcmp(this->_str, another._str) < 0 ){
		return true;
	}
	else{
		return false;
	}
}
//关系运算符重载 ==
bool Mystring::operator == (const Mystring & another){
	if (strcmp(this->_str, another._str) == 0){
		return true;
	}
	else{
		return false;
	}
}
//输入流重载 >>
istream & operator >>(istream &in , Mystring &another){
	return in >> another._str ;
}

//输出流重载 <<
ostream & operator <<(ostream &out ,const Mystring &another){
	return out << another._str << endl;
}
//申请内存重载
void* Mystring::operator new(size_t size){
	return malloc(size);
}
//new[]重载
void* Mystring::operator new[](size_t size){
	return malloc(size);
}
//删除申请的内存
void Mystring::operator delete(void* p){
	return delete p;
}
//delete[]
void Mystring::operator delete[](void* p){
	return delete []p;
}
//查找字符,在字符串第几个
//类,查找的字符
/*
char Mystring::find(const Mystring & p, char data){
	//字符串长度
	//abcd'\0'  c 总长度5
	//strchr查找data在_str中的位置sdfa
	//查出的是data开始到最后fa
	char* ptr = strchr(p._str,data);
	// ptr = fa _str = sdfa
	//int leng = strlen(_str); //4
	//int leng2= strlen(ptr); //2
	int pos = ptr - p._str ; //2
	if (p._str){
		//cout << ptr << " "<< leng2 << endl;
		cout << data << "在"<<p._str << "中的第" << pos+1 << "个" << endl;
	}
	else{
		printf("not find\n");  
	}
	return data;
}*/
char Mystring::find(char data){
	//字符串长度
	//abcd'\0'  c 总长度5
	//strchr查找data在_str中的位置sdfa
	//查出的是data开始到最后fa
	//char* ptr = strchr(this->_str,data);
	//int pos = ptr - this->_str ; //2
	//if (this->_str){
	//	//cout << ptr << " "<< leng2 << endl;
	//	cout << this->_str << "中的第" << pos+1 << "个" << endl;
	//}
	//else{
	//	printf("not find\n");  
	//}
	int leng = strlen(this->_str);
	for (int i = 0;i < leng;i++){
		if (this->_str[i] == data){
			cout << data << "在"<< this->_str << "中的第" << i+1 << "个" << endl;
		}
	}
	return data;
}

////替换第几个字符;
//pos开始的num个字符,字符
char Mystring::replace(int pos, int num,char data){
	// 0 ->5 第5个
   //abcdef 3 ->5 
	//Mystring str;
	int leng = num + pos;
	int leng1 = strlen(this->_str);
	if (leng > leng1){
		cout << "你的有点长,表示计算机,爱莫能助" << endl;
		return 0;
	}
	for (int i = 0;i <= leng;i++){
		if(i == leng){
			cout << this->_str[i] << endl;
			_str[i] = data;
			//delete [i]_str;
			break;
		}
	}
	cout << this->_str << endl;
}
//[]运算符重载
char& Mystring::operator[](int idx){
	return _str[idx];//数组下标
}
//打印输出
void Mystring::format(){
	for (size_t i = 0; i<strlen(this->_str); i++){
		cout << _str[i];
	}
	cout << endl;
}
//析构函数__释放对象开辟的资源空间
Mystring::~Mystring(){
	delete []_str; //释放
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值