首先要搞清楚,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(改天恶补指针啊啊啊)