c课程设计报告-字符串操作

上传人:熏** 文档编号:53468850 上传时间:2022-02-10 格式:DOC 页数:39 大小:91.01KB
返回 下载 相关 举报
c课程设计报告-字符串操作_第1页
第1页 / 共39页
c课程设计报告-字符串操作_第2页
第2页 / 共39页
c课程设计报告-字符串操作_第3页
第3页 / 共39页
点击查看更多>>
资源描述
C+课程设计报告 题目:字符串操作学号:xxxxxxx 姓名:xx 一:程序功能简介 1.通过多种成员函数的定义和运算符的重载,实现字符串的各种直接操作。比如:去掉串首、串尾与子串相同的字符,子串在主串中的定位,用新子串更换主串中的指定子串,比较字符串的大小,字符串连接等,所以功能已经经过验证。:程序设计思想 1.原程序定义了大量的成员函数和运算符重载函数,但是这些函数都是在固定的字符数组的前提下实现的,课程设计要求所有的函数要利用动态分配存储空间的方法存储字符串对象,所以基本上类中所有函数都要重新编写,类中的数据成员增加一项字符串的长度int nLength,这样,动态分布存储空间的操作就可以简单一些char *p=new charnLength+1; 2.main函数采用了菜单选项的形式来实现类中的各个功能,显示菜单如下:1.字符串加法2.字符串减法3.字符串比较大小4.对字符串的具体操作 1).删除字符串首部相同字符 2).删除字符串尾部相同字符 3).删除字符串的所有重复字符 4).字符串的插入操作 5).字符串的替换操作 6).字符串的倒置替换操作(首先寻找倒置的子串,再用一个新的字符串替换该子串) 7).退出5.退出 3.在程序中分别新增了一些运算符重载函数和其他函数。 inline FString operator-(const char *sAppend);/新增函数,重载减法运算法inline FString operator-(const FString sAppend);/新增函数,重载减法运算法 inline FString operator-=(char *val);/新增函数,重载-=运算符inline FString operator-=(FString val);/新增函数,重载-=运算符由于程序中的处理函数使用了字符数组sAns,它占用了大量的存储空间,为了避免使用预先定义的长度很大的数组,增加了新的析构函数FString() 释放了字符串对象所占用的空间,删除了动态分配的存储空间。新增了构造函数,用于字符串常量初始化字符串对象。三:调试过程。在调试过程中遇到一个困扰我很久的问题,一直有一个local function definitions are illegal。就是一类问题始终出现,刚开始我觉得可能是有分号输入错误,然后我就查找了一下全部的分号。查找的结果是没有错误。于是,我就排除了这方面的原因。然后我开始分部分查找错误,编译。局限到具体的小部分时候,就可以很好的排查了!结果在小的方面出错了,少了对应的一个大括号。四:输入输出数据 输入: 第一组:godlike kill 输出:1.字符串加法 godlikekill 2.字符串减法 godlike 3.字符串不比较大小 godlikelook 4. 对字符串的具体操作 1). 删除字符串首部相同字符 see 2). 删除字符串尾部相同字符 uusee 3). 删除字符串的所有重复字符 use 4). 字符串的插入操作 位置2 插入串lio 结果:uliousee 5). 字符串的替换操作 用r替换s 结果 uuree第三组:输入:perfect good输出: 1. 字符串加法 perfectgood 2.字符串减法 perfect 3.字符串不比较大小 perfectgood 4.对字符串的具体操作 1). 删除字符串首部相同字符 perfect 2). 删除字符串尾部相同字符 perfect 3). 删除字符串的所有重复字符 perfect 4). 字符串的插入操作 插入位置2 插入字符串 more 结果:pmoreerfect 5). 字符串的替换操作 用t替换f结果:pertect五:课程设计总结 在这个月的编程中,起初我发现这个题目很难,看不太懂那些东西!然后我就找到书上面对应的部分看了看,我发现什么难的程序只要你花费的时间够多的话,到最后你就会发现其实真正不是很难。只要你用心真的去做。还有另外一点,一个好的编程习惯会对你改错或者是检查的时候带来很大的帮助。比如说那个各种嵌套的函数时,要用到的大括号,最好都写在每行的最前面,也好对应看括号的个数是否对应.当然这只是举个例子。我觉得学好一个软件还是很有用处的。六:附件#include #include #include #include #include #include /定义参数个数可变的函数时用到#define MAX_FSTRING_LENGTH 250 /用作数组长度/Variant Classclass FString / 字符串类定义private:char*sString;/String data must be first (to look like string)int nlength;public:/ConstructorFString(); /缺省构造函数FString(char *str);/新增构造函数,用字符串常量初始化字符串对象FString(FString &);/新增拷贝构造函数,用类的对象初始化FString() /新增析构函数,释放字符串对象所占用的空间/Public Methodsvoid DelRepeat(); FString AddStart(FString str,int start);FString Mid(const int nStart,const int nLength);/*从字串对象中第nStart个字符开始取出nLength个字符*/FString Left(const int nLength);/从字串对象左边取出nLength个字符FString Right(const int nLength);/从字串对象右边取出nLength个字符int InStr(const int nStart, const char *sSearch,const bool bCaseSensitive=true);/*从nStart个字符处开始,在字串对象中寻找子串sSearch,参数bCaseSensitive为0表示忽略大小写*/int InStrRev(const int nStart, const char *sSearch,const bool bCaseSensitive=true);/*寻找子串的倒置串在住串中的位置*/FString RTrim(const char sChar= );/串尾整理,即去掉串尾与sChar相同的字符FString LTrim(const char sChar= );/串首整理,即去掉串首与sChar相同的字符FString Trim(const char sChar= );/串首串尾整理FString Replace(const char *sSearch, const char *sReplace);/*用子串*sReplace去替换主串中所有的子串*sSearch*/FString Format(const char *sFormat, .);/按指定格式输出字符串int Length();/Various Operatorsinline operator char*(); /转换函数inline FString operator+(const char *sAppend);/重载加法运算符inline FString operator+(const FString sAppend);/重载加法运算法inline FString operator-(const char *sAppend);/重载减法运算法inline FString operator-(const FString sAppend);/重载减法运算法inline char operator(const int nIndex);/重载运算法inline FString operator+=(char* val);/重载+=运算符inline FString operator+=(FString val);/重载+=运算符inline FString operator-=(char *val);/重载-=运算符inline FString operator-=(FString val);/重载-=运算符/Comparison Operatorsinline int operator(const char *val);/重载关系运算符inline int operator=(const char *val);/重载关系(const char *val);/重载关系运算符inline int operator=(const char *val);/重载关系=运算符inline int operator!=(const char *val);/重载关系!=运算符inline int operator=(const char *val);/重载关系=运算符inline int operator(const FString val);/重载关系运算符inline int operator=(const FString val);/重载关系(const FString val);/重载关系运算符inline int operator=(const FString val);/重载关系=运算符inline int operator!=(const FString val);/重载关系!=运算符inline int operator=(const FString val);/重载关系=运算符/Assignment OperatorsFString operator=(const char *val);/重载赋值运算符=FString operator=(const FString val);/重载对象赋值运算符=;/- FString Class, Greg De Haas - 27 March 2002 -/This is a simple string class that can come in useful/Ive kept the naming conventions similar to VB for simplicity/-/下面是 GFHString.h 中说明的各函数的具体定义/ConstructorFString:FString() sString=0;nlength=0; FString:FString(char *str)if(str)nlength=strlen(str); sString=new charnlength+1; strcpy(sString,str);else sString=0;nlength=0;FString:FString(FString &str)nlength=str.nlength;if(str.sString)sString=new charnlength+1;strcpy(sString,str.sString);elsesString=0;/Comparisonsint FString:operator(const char *val) return(strcmp(sString,val) 0); int FString:operator=(const char *val) return(strcmp(sString,val) (const char *val) return(strcmp(sString,val) 0); int FString:operator=(const char *val) return(strcmp(sString,val) = 0); int FString:operator!=(const char *val) return(strcmp(sString,val) != 0); int FString:operator=(const char *val) return(strcmp(sString,val) = 0); int FString:operator(const FString val) return(strcmp(sString,val.sString) 0); int FString:operator=(const FString val) return(strcmp(sString,val.sString) (const FString val) return(strcmp(sString,val.sString) 0); int FString:operator=(const FString val) return(strcmp(sString,val.sString) = 0); int FString:operator!=(const FString val) return(strcmp(sString,val.sString) != 0); int FString:operator=(const FString val) return(strcmp(sString,val.sString) = 0); /Other operatorsFString FString:operator+=(char* val) FString t=sString,t1;t1.nlength=t.nlength+strlen(val);t1.sString=new chart1.nlength+1;strcpy(t1.sString,sString);strcat(t1.sString,val);sString = _strdup(t1.sString);return(*this);FString FString:operator+=(FString val) FString t=sString,t1;t1.nlength=t.nlength+val.nlength;t1.sString=new chart1.nlength+1;strcpy(t1.sString,sString);strcat(t1.sString,val.sString);sString = _strdup(t1.sString);return(*this);FString FString:operator-=(char *val) /新增函数,重载减法运算符FString t=sString;char *p1,*p2;if(p2=strstr(sString,val)p1=p2+strlen(val);while(*p2+=*p1+);return t;FString FString:operator-=(FString val) /新增函数,重载减法运算符 FString m=sString;char *q1,*q2;if(q2=strstr(sString,val.sString)q1=q2+val.nlength;while(*q2+=*q1+);return m;char FString:operator(const int nIndex) /数组下标运算符重载if (nIndex (int)strlen(sString) return(0); /判断下标是否越界return(sStringnIndex-1);FString:operator char*() return(_strdup(sString); FString FString:operator+(const char *sAppend) FString t=sString;t.nlength=nlength+strlen(sAppend);t.sString=new chart.nlength+1;strcpy(t.sString,sString);strcat(t.sString,sAppend);return t;FString FString:operator+(const FString sAppend) FString t;t.nlength=nlength+sAppend.nlength;t.sString=new chart.nlength+1;strcpy(t.sString,sString);strcat(t.sString,sAppend.sString); return t;FString FString:operator-(const char *sAppend) /新增函数,重载减法运算符FString t=sString;char *p1,*p2;if(p2=strstr(sString,sAppend)p1=p2+strlen(sAppend);while(*p2+=*p1+);return(*this); FString FString:operator-(const FString sAppend) /新增函数,重载减法运算符FString t=sString;char *p1,*p2;if(p2=strstr(sString,sAppend.sString)p1=p2+strlen(sAppend.sString);while(*p2+=*p1+);return(*this); FString FString:operator=(const char *val) if(sString) delete sString;nlength=strlen(val);sString=new charnlength+1;strcpy(sString,val); return(*this); FString FString:operator=(FString val) sString = _strdup(val.sString); return(*this); FString FString:AddStart(FString str,int start) /新增成员函数,将字符串str插入到原字符串中从第start字符开始的位置上char qMAX_FSTRING_LENGTH=;strncpy(q,sString,start-1);strcat(q,str.sString);strcat(q,sString+start-1); sString = _strdup(q);return(*this);void FString:DelRepeat() /新增成员函数,删除原字符串中相邻的重复字符int n;char sAnsMAX_FSTRING_LENGTH=;n=strlen(sString);for(int i=0;in;i+)if(sStringi+1=sStringi)for(int j=i;jn;j+)sStringj=sStringj+1;DelRepeat();strcpy(sAns,sString); sString = _strdup(sAns);/coutsStringRTrim(sChar).LTrim();/注意此处的用法!FString FString:RTrim(char sChar)/串尾整理,即去掉串尾与 sChar 相同的字符 long nLen = strlen(sString);FString sAns2;int cnt=nLen-1;sAns2 = sString;/Validateif (nLen = 0) return(sAns2);/Determine # of charswhile (sStringcnt = sChar & cnt=0) cnt-;if (cnt = (nLen-1) return sAns2;/Get characterschar *sAns=new charcnt+1;strncpy(sAns,sString,cnt+1);sAns2 = sAns;return(sAns2);FString FString:LTrim(char sChar)/串首整理,即去掉串首与 sChar 相同的字符 long nLen = strlen(sString);FString sAns2;int cnt=0;sAns2 = sString;/Validateif (nLen = 0) return(sAns2);/Determine # of charswhile (sStringcnt = sChar) cnt+;if (cnt = 0) return sAns2;/Get characterschar *sAns=new charnLen-cnt;strncpy(sAns,sString+cnt,nLen-cnt);sAns2 = sAns;return(sAns2); /从字串 sString 中第 nStart 个字符开始取出 nLength 个字符FString FString:Mid(int nStart,int nLength) FString sAns2;long nLen = strlen(sString);sAns2 = ;/Validateif (nLen = 0) return(sAns2);if (nLength nLen) nLength = nLen;/Get characterschar *sAns=new charnlength;strncpy(sAns,sString+(nStart-1),nLength);sAns2 = sAns;return(sAns2); FString FString:Left(int nLength) /从字串sString左边取出nLength个字符charsAnsMAX_FSTRING_LENGTH=;FString sAns2;long nLen = strlen(sString);sAns2 = ;/Validateif (nLen = 0) return(sAns2);if (nLength nLen) nLength = nLen;/Get charactersstrncpy(sAns,sString,nLength);sAns2 = sAns;return(sAns2); FString FString:Right(int nLength)/从字串 sString 右边取出 nLength 个字符 charsAnsMAX_FSTRING_LENGTH=;FString sAns2;long nLen = strlen(sString);sAns2 = ;/Validateif (nLen = 0) return(sAns2);if (nLength nLen) nLength = nLen;/Get charactersstrncpy(sAns,sString+(nLen-nLength),nLength);sAns2 = sAns;return(sAns2); /*从nStart个字符处开始,在sString中寻找子串sSearch的起始位置,参数bCaseSensitive为0表示忽略大小写*/int FString:InStr(const int nStart, const char *sSearch, const bool bCaseSensitive) /Get Lengthsint nLen1 = strlen(sSearch);int nLen2 = strlen(sString); /Other varsint cnt=nStart-1;int cnt2=0;bool bFound;int nMax = (nLen2-nLen1+1);bool bTest;/Validationif (cnt (nLen2-nLen1+1) return(0);/Recurse Stringfor (cnt=cnt;cntnMax;cnt+) /Test first charbTest = (bCaseSensitive) ? (sStringcnt = sSearch0) : (tolower(sStringcnt) = tolower(sSearch0);if (bTest) /经过大小写过滤后已找到的第一个字符bFound = true;/默然已找到for (cnt2=0; cnt2nLen1;cnt2+)/接着找后面nLen1个字符if (bCaseSensitive) if (!(sStringcnt2+cnt = sSearchcnt2) bFound = false; else if (!(tolower(sStringcnt2+cnt) = tolower(sSearchcnt2) bFound = false;if (bFound) return(cnt+1);/找到,返回第一个字符的位置return 0; /没有找到/寻找子串的倒置串在主串中的位置int FString:InStrRev(const int nStart, const char *sSearch, const bool bCaseSensitive) /Get Lengthsint nLen1 = strlen(sSearch);int nLen2 = strlen(sString); /Other varsint cnt=nStart-nLen1;int cnt2=0;bool bFound;bool bTest;/Validation8uif (cnt (nLen2-nLen1+1) cnt = (nLen2-nLen1+1);/Recurse Stringfor (cnt=cnt;cnt=0;cnt-)/反过来搜索母串/Test first charbTest = (bCaseSensitive) ? (sStringcnt = sSearch0) : (tolower(sStringcnt) = tolower(sSearch0);if (bTest) /找到第一个字符bFound = true;for (cnt2=0; cnt2nLen1;cnt2+)/接下去查if (bCaseSensitive) if (!(sStringcnt2+cnt = sSearchcnt2) bFound = false; else if (!(tolower(sStringcnt2+cnt) = tolower(sSearchcnt2) bFound = false;if (bFound) return(cnt+1);/找到return 0; /没有找到/按指定格式输出参数可变的函数FString FString:Format(const char *sFormat, .) char buffer20000=;FString sAns;sAns = ; if (!sFormat) return(sAns); /格式非法,返回空字串 va_list arglist; /参数可变格式要求的类型 va_start(arglist,sFormat); vsprintf(buffer,sFormat,arglist); va_end(arglist);sAns = buffer;return(sAns);/用子串*sReplace 去替换主串中的所有子串*sSearchFString FString:Replace(const char *sSearch, const char *sReplace) int nSearchLen=strlen(sSearch);int nPos=0;int nDiffLen=strlen(sReplace)-strlen(sSearch);FString sTemp;FString sLeft, sRight;sTemp = sString;/Recurse stringnPos = sTemp.InStr(nPos+1,sSearch);while (nPos != 0) sLeft = sTemp.Left(nPos-1);sRight = sTemp.Right(strlen(sTemp.sString)-nPos+1)-nSearchLen);sTemp = sLeft + sReplace + sRight;nPos = sTemp.InStr(nPos + nDiffLen + 1,sSearch);return sTemp;int FString:Length() return(strlen(sString); /返回字符串长度void menu()coutnnntttt字符串操作 ntttt主菜单 nnnt1.)字符串加法。nt2.)字符串减法。nt3.)字符串比较大小。nt4.)对字符串的具体操作。nt5.)Exitn endl;void submenu()coutPlease enter your choice:endl;cout endl;cout 1) 删除字符串首部相同字符endl;cout 2) 删除字符串尾部相同字符endl;cout 3) 删除字符串的所有重复字符endl;cout 4) 字符串的插入操作endl;cout 5) 字符串的替换操作endl;cout 6) Exitendl; cout endl;void F1(FString s) /字符串加法 FString s2,s3(good!);cout请输入要操作的字符串endl;char *p=new char100; cin.getline(p,100);coutendl; char *p1=new char100; cin.getline(p1,100);s+=p1; /1s2=s+p1;/2cout结果为:sendl;cout endl;delete p;delete p1;void F2(FString s) /字符串减法FString sk;cout请输入要操作的字符串endl;char *p=new char100; cin.getline(p,100); char *p1=new char100; cin.getline(p1,100);sk=s-p1;cout结果为:skendl;delete p;delete p1;void F3(FString s) /字符串比较大小cout请输入要操作的字符串endl;char *p=new char100; cin.getline(p,100);coutendl; char *p1=new char100; cin.getline(p1,100);if(sp1)cout结果为:sp1p1)cout结果为:sp1endl;else if(s=p1)cout结果为:s=p1endl;delete p;delete p1;void F41(FString s3) /删除字符串首部相同字符 FString s1=s3;for(int i=1;i=s3.Length()&s3i=s3i+1;i+)s1=s3.LTrim(s3i);coutresult:s1=1&s3l=s3l-1;l-)s1=s3.RTrim(s3l);coutresult:s1endl;void F43(FString s3) /删除字符串的所有重复字符 FString s4(s3);couts:s4endl;coutresult:;s4.DelRepeat();couts4n;void F44(FString s3) /字符串的插入操作 int m;coutm;char *p=new char100;cin.getline(p,100);char *p1=new char100;cout输入插入字符串:;cin.getline(p1,100);coutresult:s3.AddStart(p1,m)endl;delete p;delete p1;void F45(FString s3) /字符串的替换操作char *p1=new char100;cin.getline(p1,100);coutp1endl;char *p2=new char100;cout格式:用什么替换什么endl;cout用:;cin.getline(p2,100);char *p3=new char100; cout替换:endl;cin.getline(p3,100); coutReplace : s3.Replace(p3,p2)endl;delete p1;delete p2;delete p3;void main() int m;menu(); FString s,s2,s3;char *p=new char100;cout请输入要操作的字符串endl;cin.getline(p,100);s=p;s2=s;system (cls);label1:menu();while(m!=5)cout*您现在位于主菜单endl; cout原字符串: sendl;cout endl;cout*请输入您要执行的任务:m;switch(m)case 1:cout字符串加法endl; F1(s); system(pause); system (cls); menu();break;case 2:cout字符串减法endl;F2(s);system(pause);system (cls); menu();break;case 3:cout字符串比较大小n;switch(n)case 1: cout删除字符串首部相同字符endl;F41(s);system(pause); system (cls);break;case 2:cout删除字符串尾部相同字符endl;F42(s);system(pause); system (cls);break;case 3:cout删除字符串的所有重复字符endl;F43(s);/system(pause); /system (cls);break;case 4:cout字符串的插入操作endl; F44(s2);system(pause); system (cls);break;case 5:cout字符串的替换操作endl;F45(s2);system(pause); system (cls);break;case 6:cout退出,返回主菜单.endl;goto label1;break;default:cout输入错误!请重新输入.endl;goto label3;break;system(pause);system (cls);case 5:cout退出程序endl;exit(0);default:system (cls);cout输入错误!请重新输入.endl;goto label2;
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 方案规范


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!