小班作业:MyString类的实现

首先要搞清楚,MyString类准备实现哪些功能

列举如下:

1.字符串打印
2.字符串长度
3.字符串拼接
4.字符串复制
5.字符串比较
6.字符串反转
7.字符查找
8.字符串查找
9.字符串插入
10.字符串替换
11.字符串截取
12.退出MyString

下面开工!

main.cpp

#include"String.h"
#include"ConsoleColor.h"
int main() {
	cout<<blue<<"===================================================="<<endl;
	cout<<endl;
	cout<<yellow<<"************客官您好!欢迎使用MyString类************"<<endl;
	cout<<endl;
	cout<<purple<<"*********我是您的MyString类使用向导,蜜桃猫*********"<<endl;
	cout<<endl;
	cout<<yellow<<"*下面请您跟随我的指引,享受这次愉快的字符串之旅吧!*"<<endl;
	cout<<endl;
	cout<<blue<<"===================================================="<<white<<endl;
	MyString ss;
	cout<<"请输入str:"<<endl;
	char str[10001];
	cin>>str;
	ss.getStr(str);
	int choice = 0;
	while (true) {
FLAG1:
		ss.showMenu1();
		cout << "请输入你的选择:" << endl;
		cin >>choice;
		cout<<endl;
		switch (choice) {
			case 0:
				ss.exitSystem();
				break;
			case 1:
				ss.strPrint();
				break;
			case 2:
				ss.strLength();
				break;
			case 3:
				ss.strCatenate();
				break;
			case 4:
				ss.strCopy();
				break;
			case 5:
				ss.strCompare();
				break;
			case 6:
				ss.strReverse();
				break;
			case 7:
				ss.charSearch();
				break;
			case 8:
				ss.strSearch();
				break;
			case 9:
				goto FLAG2;
			default:
				system("cls");
				//fflush(stdin);
				break;
		}
	}
	while (true) {
FLAG2:
		ss.showMenu2();
		cout << "请输入你的选择:" << endl;
		cin >> choice;
		switch (choice) {
			case 10:
				ss.exitSystem();
				break;
			case 11:
				ss.strInsert();
				break;
			case 12:
				ss.strChange();
				break;
			case 13:
				ss.strCut();
				break;
			case 14:
				goto FLAG1;
			default:
				system("cls");
				break;
		}
	}
	system("pause");
	return 0;
}

用一个switch语句完成各项功能的实现是很早以前就有的构想,这个原理与通讯录管理系统类似。然鹅,这个翻页功能是我灵光乍现,联系结合MC中的书和查看领地权限的类似功能而想到的。但是美中不足的地方就是翻到下一页后就不能调用上一页的函数了,有点可惜(好吧其实也好改,但是真的是不想再肝小班了不如去做大作业QAQ)

String.h

#ifndef STRING_H
#define STRING_H
#include<bits/stdc++.h>
using namespace std;
class MyString {
	public:
		void getStr(char str[]);
		void showMenu1();
		void showMenu2();
		void strPrint();
		void strLength();
		void strCatenate();
		void strCopy();
		void strCompare();
		void strReverse();
		void charSearch();
		void strSearch();
		void strInsert();
		void strChange();
		void strCut();
		void exitSystem();
		MyString();
		MyString(const MyString&str);
		~MyString();
	private:
		//char *p_str=arr1;
		int strlength;
		char arr1[10001];
		char arr2[10001];
};
#endif

String.cpp

#include"String.h"
#include"ConsoleColor.h"
char str[10001];
int n=0,m=0;
int num1,num2;
MyString::MyString() {
	strlength=0;
	char *arr1=new char[10001];
	char *arr2=new char[10001];
}
MyString::~MyString() {
	delete[]arr1;
	delete[]arr2;
	//delete[]p_str;
}
void MyString::getStr(char str[]) {
	strcpy(arr1,str);
}
void MyString::showMenu1() {
	cout << "Page:1***********************************" << endl;
	cout << "************欢迎使用MyString类***********" << endl;
	cout << "**************0.退出MyString*************" << endl;
	cout << "**************1.字符串打印***************" << endl;
	cout << "**************2.字符串长度***************" << endl;
	cout << "**************3.字符串拼接***************" << endl;
	cout << "**************4.字符串复制***************" << endl;
	cout << "**************5.字符串比较***************" << endl;
	cout << "**************6.字符串反转***************" << endl;
	cout << "**************7.字符查找*****************" << endl;
	cout << "**************8.字符串查找***************" << endl;
	cout << "**************9.下一页*******************" << endl;
	cout << "*****************************************" << endl;
	cout << endl;
}
void MyString::showMenu2() {
	cout << "Page:2***********************************" << endl;
	cout << "************欢迎使用MyString类***********" << endl;
	cout << "**************10.退出MyString************" << endl;
	cout << "**************11.字符串插入**************" << endl;
	cout << "**************12.字符串替换**************" << endl;
	cout << "**************13.字符串截取**************" << endl;
	cout << "**************14.上一页******************" << endl;
	cout << "*****************************************" << endl;
	cout << endl;
}
void MyString::strPrint() {
	cout<<"您输入的str字符串为:"<<arr1<<endl;
	cout<<endl;
}
void MyString::strLength() {
	cout<<"您输入的str字符串长度为:"<<strlen(arr1)<<endl;
	cout<<endl;
}
void MyString::strCatenate() {
	cout<<"请输入要拼接的字符串:"<<endl;
	cin>>str;
	strcpy(arr2,str);
	strcat(arr1,arr2);
	cout<<"拼接完毕!"<<endl;
	cout<<"拼接后的字符串为:"<<arr1<<endl;
	cout<<endl;
}
void MyString::strCopy() {
	cout<<"请输入要复制成的字符串:"<<endl;
	cin>>str;
	strcpy(arr2,str);
	strcpy(arr1,arr2);
	cout<<"复制完毕!"<<endl;
	cout<<"复制后的字符串为:"<<arr1<<endl;
	cout<<endl;
}
void MyString::strCompare() {
	cout<<"请输入要比较的字符串:"<<endl;
	cin>>str;
	strcpy(arr2,str);
	int temp=strcmp(arr1,arr2);
	cout<<"比较完毕!"<<endl;
	if(temp==0) {
		cout<<"字符串1与字符串2相等"<<endl;
	} else if(temp>0) {
		cout<<"字符串1大于字符串2"<<endl;
	} else {
		cout<<"字符串1小于字符串2"<<endl;
	}
	cout<<endl;
}
void MyString::strReverse() {
	cout<<"请输入想要反转的字符串范围(闭区间num1~num2):"<<endl;
	cout<<"num1值为:";
	cin>>num1;
	cout<<"num2值为:";
	cin>>num2;
	reverse(arr1+num1-1,arr1+num2);
	cout<<"反转完毕!"<<endl;
	cout<<"反转后的字符串为:"<<arr1<<endl;
	cout<<endl;
}
void MyString::charSearch() {
	cout<<"请输入想要查找的字符:"<<endl;
	char temp;
	cin>>temp;
	if(strchr(arr1,temp)!=NULL) {
		cout<<"查找完毕!"<<endl;
		cout<<"该字符第一次出现的位置为:"<<strchr(arr1,temp)<<endl;
	} else {
		cout<<"未查找到该字符!请重试" <<endl;
		return;
	}
	cout<<endl;
}
void MyString::strSearch() {
	cout<<"请输入想要查找的字符串:"<<endl;
	cin>>str;
	if(strpbrk(arr1,str)!=NULL) {
		cout<<"查找完毕!"<<endl;
		cout<<"该字符串第一次出现的位置为:"<<strpbrk(arr1,str)<<endl;
	} else {
		cout<<"未查找到该字符串!请重试" <<endl;
		return;
	}
	cout<<endl;
}
void MyString::strInsert() {
	cout<<"请输入想要插入的字符串:"<<endl;
	cin>>str;
	cout<<"请输入想要插入的位置:"<<endl;
	cin>>n;
	m=strlen(str);
	char temp[1001];
	strcpy(temp,arr1);
	strncpy(arr1+n-1,str,m);
	strncpy(arr1+n+m-1,temp+n-1,strlen(temp)-n+1);
	cout<<"插入完毕!"<<endl;
	cout<<"插入后的字符串为:"<<arr1<<endl;
	cout<<endl;
}
void MyString::strChange() {
	cout<<"请输入想要替换成的字符串:"<<endl;
	cin>>str;
	cout<<"请输入想要替换的位置:"<<endl;
	cin>>n;
	m=strlen(str);
	strncpy(arr1+n-1,str,m);
	cout<<"替换完毕!"<<endl;
	cout<<"替换后的字符串为:"<<arr1<<endl;
	cout<<endl;
}
void MyString::strCut() {
	char temp[1001];
	cout<<"请输入想要截取的部分区间短点(num1~num2):" <<endl;
	cout<<"num1值为:";
	cin>>num1;
	cout<<"num2值为:";
	cin>>num2;
	strncpy(arr1,arr1+num1-1,num2-num1+1);
	arr1[num2-num1+1]='\0';
	cout<<"截取完毕!"<<endl;
	cout<<"截取后的字符串为:"<<arr1<<endl;
	cout<<endl;
}
void MyString::exitSystem() {
	cout << "客官慢走,欢迎下次使用!" << endl;
	system("pause");
	exit(0);
}

基础代码已经完成了,下面为了把介绍做的更美观一点,我玩了点花活^-^

增加了一个字体变色函数,美中不足的是这个函数只有红绿蓝三原色,其他颜色需要自己配,而这三种颜色的排列组合又是有限种的,所以我就多配出来一个白色和一个紫色

ConsoleColor.h

#pragma once
#include <iostream>
#include <windows.h>
inline std::ostream& blue(std::ostream &s) {
	HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hStdout, FOREGROUND_BLUE
	                        |FOREGROUND_GREEN|FOREGROUND_INTENSITY);
	return s;
}

inline std::ostream& red(std::ostream &s) {
	HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hStdout,
	                        FOREGROUND_RED|FOREGROUND_INTENSITY);
	return s;
}
inline std::ostream& purple(std::ostream &s) {
	HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hStdout,
	                        FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_INTENSITY);
	return s;
}

inline std::ostream& green(std::ostream &s) {
	HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hStdout,
	                        FOREGROUND_GREEN|FOREGROUND_INTENSITY);
	return s;
}

inline std::ostream& yellow(std::ostream &s) {
	HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hStdout,
	                        FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY);
	return s;
}

inline std::ostream& white(std::ostream &s) {
	HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hStdout,
	                        FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
	return s;
}

struct color {
	color(WORD attribute):m_color(attribute) {};
	WORD m_color;
};

template <class _Elem, class _Traits>
std::basic_ostream<_Elem,_Traits>&
operator<<(std::basic_ostream<_Elem,_Traits>& i, color& c) {
	HANDLE hStdout=GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hStdout,c.m_color);
	return i;
}

实现的结果捏,就如下图所示:

 

 


最后,总结一下问题,一句话骂醒自己:

玩C不玩针,和废铁有什么区别?

下面是致歉环节:

本人技艺不精,不怎么会玩指针,惭愧惭愧QAQ(改天恶补指针啊啊啊)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一二爱上蜜桃猫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值