C/C++面试常见题目之字符串操作(二)

字符串是一种常用的数据类型,现在我们将其常用的功能用代码实现如下:

class String
{
	char* ptr;
	int len;
public:
/*********************************无参构造*********************************/
	String() {
		ptr = new char[1]{'\0'};
		len = 0;
	}
/*********************************拷贝构造*********************************/	
	String(const char* s) {
		cout << "const char* "<< endl;
		len = strlen(s);
		ptr = new char[len+1];
		memcpy(ptr, s, len+1);
	}
	/*********************************拷贝构造*********************************/
	String(char c, int n) {
		len = n;
		ptr = new char[n+1]{};
		memset(ptr, c, n);
	}
	//const String& 拷贝构造函数的原型, 
	//1,引用可以改变实参,不应该改变实参的内容
	//2,const & 可以引用右值(匿名变量)
	/*********************************拷贝构造*********************************/
	String(const String& s) {
		cout << "copy " << endl;
		len = s.len;
		ptr = new char[s.len+1]{};
		memcpy(ptr, s.ptr, len);
	}
	/*********************************字符串长度*********************************/
	int size() {
		return len;
	}
	/*********************************判断字符串是否为空*********************************/
	bool empty() {
		return len == 0;
	}
	/*********************************字符串首地址*********************************/
	const char* c_str() {
		return ptr;
	}
	/*********************************字符串长度重置*********************************/
	void resize(int n) {
		char* p = new char[n+1]{};
		memcpy(p, ptr, n);
		delete [] ptr;
		ptr = p;
		len = n;
	}
	// ptr = "hello" 
	//        hlo  
	//	p  = "000"
	//				1,  2
	/*********************************字符串删除*********************************/
	void erase(int pos, int n) {
		if (pos < 0 || pos >= len) {
			cout << "超出范围" << endl;
			abort();
		} 
		if (n < 0) {
			cout << "长度小于0" << endl;
			abort();
		}
		n = n > len - pos ? len - pos : n;
		
		char* p = new char[len-n+1]{};
		memcpy(p, ptr, pos);
		memcpy(p+pos, ptr+pos+n, len-pos-n);
		delete [] ptr;
		ptr = p;
		len = len - n;
	}
	/*********************************字符串头插入*********************************/
	void insert(int pos, const char* s) {
		replace(pos, 0, s);
	}						
					//	"he\0llo"
	/*********************************字符串任意插入*********************************/
	void insert(int pos, const String& s) {
		replace(pos, 0, s);
	}
	/*
			  pos+n
	           | |
	// ptr = "hello",  s = "world"
			   --
	//               1,     2
	// ptr = "hworldlo";
			   -----
*/
/*********************************字符串任意插入*********************************/
	void replace(int pos, int n, const String& s) {
		if (pos < 0 || pos >= len) {
			cout << "超出范围" << endl;
			abort();
		} 
		if (n < 0) {
			cout << "长度小于0" << endl;
			abort();
		}
		n = n > len - pos ? len - pos : n;
		int sl = s.len; //String类型的长度不能用strlen测量
		char* p = new char[len+sl-n+1]{};
		memcpy(p, ptr, pos);
		memcpy(p+pos, s.ptr, sl);
		memcpy(p+pos+sl, ptr+pos+n, len-pos-n);
		len = sl + len - n;
		delete [] ptr;
		ptr = p;
	}
	/*********************************字符串任意替换*********************************/
	void replace(int pos, int n, const char* s) {
		if (pos < 0 || pos >= len) {
			cout << "超出范围" << endl;
			abort();
		} 
		if (n < 0) {
			cout << "长度小于0" << endl;
			abort();
		}
		n = n > len - pos ? len - pos : n;
		int sl = strlen(s);
		char* p = new char[len+sl-n+1]{};
		memcpy(p, ptr, pos);
		memcpy(p+pos, s, sl);
		memcpy(p+pos+sl, ptr+pos+n, len-pos-n);
		len = sl + len - n;
		delete [] ptr;
		ptr = p;
	}
	/*********************************字符串查找*********************************/
	String substr(int pos, int n) {
		//	ptr[pos] ~ ptr[pos+n-1]
		if (pos < 0 || pos >= len) {
			cout << "超出范围" << endl;
			abort();
		} 
		if (n < 0) {
			cout << "长度小于0" << endl;
			abort();
		}
		n = n > len - pos ? len - pos : n;
		char* p = new char[n+1];
		memcpy(p, ptr+pos, n);
		String t;
		delete [] t.ptr;
		t.ptr = p;
		t.len = n;
		return t;
	}
	void show() {
		cout << (void*)ptr << " ";
		for (int i=0; i<len; i++)
			cout << ptr[i];
		cout << endl;
	}
	String show(String s) {
		s.show();
		String t("banana");
		return t;
	}
	//析构函数
	~String() {
		cout << "delete " << ptr <<endl;
		delete [] ptr;
	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌上花开缓缓归以

你的鼓励将是我创作的最大动力,

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值