字符串

来源:互联网 发布:banner制作软件 编辑:程序博客网 时间:2024/06/06 09:33

MyString.h

//MyString.h#ifndef MYSTRING_H#define MYSTRING_H#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAXSIZE 100/**链表存储**/typedef struct StrNode{char ch;struct StrNode *next;int length;}StrNode;/******顺序表存储******/typedef struct HString{char ch[MAXSIZE];int length;}HString;void StrCreat(HString *T);//创建一个字符串,放入T中void StrOut(HString *T);void StrAssign(HString *T,char *chars);//生成一个其值等于常量chars的串Tint StrLength(HString S);//返回S的元素个数int StrCompare(HString S,HString T);//两个串比较输出两串的长度差//如果两串相同,则输出111void clearStr(HString *S);void concat(HString *T,HString S1,HString S2);void SubStr(HString *Sub,HString S,int pos,int len);//用sub返回串S的第pos个字符起长度为len的子串//Sub=(HString *)malloc(sizeof(HString));int Index(HString S,HString T,int pos);//返回主串S中第pos个字符之后的存在与T//相等的第一个子串的 位置void StrInsert(HString *S,int pos, HString T);//在串的的pos个字符之前插入串Tvoid StrDelete(HString *S,HString T);//从串S中删除与T相同所有的字符串void StrReplace(HString *S,HString T,HString V);//用V替换S中所有T的字符void StrCopy(HString *s,HString *h);StrNode *LStrAssign();//链表创建一个字符串void printStr(StrNode *S);//输出void Strreplace(StrNode *S,StrNode T,StrNode V);//替换   ERROR#endif

MyString.cpp

////////////////////////////////////////////////////////////MyString.cpp#include<stdio.h>#include<stdlib.h>#include<string.h>#include"MyString.h"/***********************检测完毕************1****************/void StrCreat(HString *T)//创建一个字符串,放入T中{  char c;int j=0;printf("\n请输入一个字符串,以*作为结束:");scanf("%c",&c);while(c!='*' && j<MAXSIZE){T->ch[j]=c;j++;scanf("%c",&c);}T->ch[j]='\0';T->length=j-1;}/***********************检测完毕**********2******************/void StrOut(HString *T){printf("\n");printf("字符串是%s\t**长度是%d\n",T->ch,T->length);}void StrAssign(HString *T,char *chars)//生成一个其值等于常量chars的串T{int i,j;char c[MAXSIZE];i=0;if(T->ch)free(T->ch);if(!(T=(HString *)malloc(sizeof(HString))))printf("ERROR");while(c[i]){c[i]=*chars;chars++;i++;printf(" %c ",c[i]);}if(i==0) printf("NULL");else{for(j=0;j<=i;j++){T->ch[j]=c[j];}T->ch[j+1]='\0';T->length=i;}}int StrLength(HString S)//返回S的元素个数{return (S.length);}/***************************检测完毕*********************/                                          int StrCompare(HString S,HString T)//两个串比较输出两串的长度差{                                  //如果两串相同,则输出111int i;i=0;while(i<S.length && i<T.length){i++;if(S.ch[i]!=T.ch[i]) return (S.length-T.length);else return 111;//两个串相等,返回111}}void clearStr(HString *S){if(S->ch){free(S->ch);}//S->ch=NULL;}S->length=0;}/***************************检测完毕*********************/   void concat(HString *T,HString S1,HString S2)//用T返回由S1和S2连接而成的新串{int i;if(T->ch) free(T->ch);if(S1.length+S2.length<=MAXSIZE){for(i=0;i<=S1.length;i++) {T->ch[i]=S1.ch[i];}for(i=S1.length+1;i<=S1.length+S2.length;i++)  {T->ch[i]=S2.ch[i-S1.length];}T->ch[S1.length+S2.length+1]='\0';T->length=S1.length+S2.length;}else printf("OVERFLOW");}/****************************检测完毕******************************/void SubStr(HString *Sub,HString S,int pos,int len){//用sub返回串S的第pos个字符起长度为len的子串//Sub=(HString *)malloc(sizeof(HString));int i;if(pos<1 || pos>S.length || len<0 || len>S.length-pos-1)printf("ERROR");if(Sub->ch)  free(Sub->ch);if(!len){/*Sub->ch=NUL;*/ Sub->length=0;}else{for(i=0;i<=len-1;i++){Sub->ch[i]=S.ch[pos+i];}Sub->ch[len]='\0';Sub->length=len;}}/***************************检测完毕*******************************/int Index(HString S,HString T,int pos)//返回主串S中第pos个字符之后的存在与T{                                      //相等的第一个子串的 位置int i,n,m,j,flag,k=0;//HString *sub;//sub=(HString *)malloc(sizeof(HString));if(pos>0){n=S.length;m=T.length;i=pos;while(S.ch[i]!='\0'){i++;k=i;for(j=0;j<m;j++){//printf("#%c#",S.ch[i+j]);//printf("\t!%c!\t",T.ch[j+1]);if(S.ch[i+j]==T.ch[j+1]) flag=1;else flag=0;} if(flag==0) continue;if(flag==1)break;//return i;// return i;}}return k;}/*******************检测完毕****************************/void StrInsert(HString *S,int pos, HString T){//在串的的pos个字符之前插入串Tint j,ns,ms,k,n;n=0;ns=S->length;ms=T.length;if(pos<1 || pos>S->length+1)printf("ERROR");if(T.length){//if (!(S->ch=(char *)realloc(S->ch,(S->length+T.length+1) *sizeof(char)))//printf("ERROR");   /*for(i=S->length+1;i>pos+1;--i){ S->ch[i+T.length]=S->ch[i];}for(i=0;i<T.length;i++){S->ch[pos+i]=T.ch[i];}S->length+=T.length;*/k=ns+ms+1;for(j=ns+1;j>=pos;k--,j--){S->ch[k]=S->ch[j];}for(k=1;k<=ms && T.ch[n]!='\0';k++){S->ch[pos+k-1]=T.ch[k];++n;}S->length+=T.length;}}/********************检测完毕******************************/void StrDelete(HString *S,HString T){//从串S中删除与T相同所有的字符串int ns,nt,i,flag,n;n=0;ns=S->length;nt=T.length;if(nt>ns || ns<0 || nt<0) printf("ERROR");//for(n=0;n<ns;n++)while(S->ch[n]!='\0'){n++;for(i=0;i<nt;i++)if(S->ch[n+i]==T.ch[i]) flag=1;else flag=0;if(flag==1){for(i=0;i<ns;i++){//printf("&%c&",S->ch[n+i+1]);S->ch[n+i+1]=S->ch[n+nt+i+1];//printf("#%c#",S->ch[n+i+1]);}//forprintf("\t\t");ns=ns-nt;S->ch[ns+i]='\0';n=0;S->length=ns;}//else printf("你要删除的字符不存在!");}}/******************检测完毕**********************************/void StrReplace(HString *S,HString T,HString V){//用V替换S中所有T的字符int ns,nt,nv,nc,i,flag,n,j=0;n=0;ns=S->length;nt=T.length;nv=V.length;nc=nt-nv;if(nt>ns || ns<0 || nt<0 || nv<0 || nv>ns) printf("ERROR");//for(n=0;n<ns;n++)while(S->ch[n]!='\0'){n++;for(i=0;i<nt;i++){if(S->ch[n+i]==T.ch[i]) flag=1;else flag=0;}if(flag==1){if(nt==nv)//完成{for(i=0;i<nv;i++){printf("#%c#",S->ch[n+i+1]);S->ch[n+i+1]=V.ch[i+1];printf("\t\t!%c!\t\t",V.ch[i+1]);}}if(nv>nt)//abcdefghijk* de* abcd*  错误{for(i=ns-nc;i>n+nv;i--){//printf("#%c#",S->ch[i]);S->ch[i]=S->ch[i+nc];//printf("\t!%c!\t",S->ch[i]);}//printf("\n/*************************/\n");for(j=0;j<nv;j++){//printf("#%c#",S->ch[n+j+1]);S->ch[n+j+1]=V.ch[j+1];//printf("\t\t!%c!\t\t",S->ch[n+j+1]);}ns=ns+nv-nt;S->ch[ns-nc+1]='\0';S->length=ns;}if(nv<nt)//完成{while(V.ch[j+1]!='\0'){//printf("#%c#",S->ch[n+j+1]);S->ch[n+j+1]=V.ch[j+1];//printf("\t\t!%c!\t\t",S->ch[n+j+1]);j++;}printf("\n/*************************/\n");for(i=n+nt;i<=ns;i++){//printf("#%c#",S->ch[i+1-nc]);S->ch[i+1-nc]=S->ch[i+1];//printf("\t\t!%c!\t\t",S->ch[i+1]);}S->length=S->length+nv-nt;S->ch[S->length+1]='\0';j=0;}}//else printf("你要找的字符不存在!");}}void StrCopy(HString *s,HString *h){int i;i=0;if(s->ch)  free(s);s=(HString *)malloc(sizeof(HString));while(h->ch[i]!='\0'){s->ch[i]=h->ch[i];i++;}s->ch[i]='\0';s->length=h->length;}/*********************检测完毕*****************************/StrNode *LStrAssign(){//链表创建StrNode *S,*p,*r;char c;int i=0;S=r=NULL;printf("\n\n\t\t请输入一个字符串,已*作为结束:");c=getchar();while(c!='*'){i++;p=(StrNode *)malloc(sizeof(StrNode));p->ch=c;if(S==NULL) S=p;else r->next=p;r=p;c=getchar();}if(r) r->next=NULL;S->length=i-1;return S;}/***********************检测完毕***************************/void printStr(StrNode *S){StrNode *p;p=S;printf("\n输入的字符串是:");while(p->next!=NULL){p=p->next;printf("%c",p->ch);}printf("\n字符串的长度是:%d\n",S->length);}void Strreplace(StrNode *S,StrNode T,StrNode V){//用V替换S中T的所有字符int ls,lt,lv,flag;//分别为S、T、V的长度StrNode *p,*q,*n,*p1,*p2,*q1;p=S;q=&T;n=&V;ls=S->length;lt=T.length;lv=V.length;while(p->next!=NULL){p=p->next;p1=p;q1=q->next;while(q->next){if(p1->next->ch==q1->ch) flag=1;else flag=0;p1=p1->next;q1=q1->next;p1=p1->next;}if(flag==1){p->next=n;while(n->next){n=n->next;}n->next=p2;}S->length=S->length-T.length+V.length;}}

测试程序main.cpp

#include<stdio.h>#include<malloc.h>#include <malloc.h>#include "MyString.h"void main(){char choice,*cs;int l,a,b,c,d;HString *th,*ch,*sh,*xh,s,*sub;StrNode *ss,*ts,*vs;char chs;do{//cs=(char *)malloc(100*sizeof(char));printf("选择要进行的操作 \n");printf("======================================\n");printf("\t\t1.构建一个字符串\n");//完成printf("\t\t2.返回字符串的长度\n");//完成printf("\t\t3.两个字符串相比较\n");//完成printf("\t\t4.连接两个字符串\n");//完成printf("\t\t5.取出字符\n");//完成printf("\t\t6.从T字符串删除S字符串\n");//完成printf("\t\t7.从s中返回第i个与t相等的字符的位置\n");//完成printf("\t\t8.在串的的pos个字符之前插入串T\n");//完成printf("\t\t9.替换字符\n");printf("\t\ta.字符串初始化\n");//链式存储  完成printf("\t\tb.复制一个字符串\n");printf("\t\t0.退出\n");printf("======================================\n");printf("(0,1,2,3,4,5,6,7,8,9)");th=(HString *)malloc(sizeof(HString));sh=(HString *)malloc(sizeof(HString));ss=(StrNode *)malloc(sizeof(StrNode));choice=getchar();switch(choice){case '1':StrCreat(th);StrOut(th);break;case '2':StrCreat(th);StrOut(th);l=StrLength(*th);printf("%d\n",l);break;case '3':StrCreat(th);StrOut(th);StrCreat(sh);StrOut(sh);l=StrCompare(*th,*sh);if(l!=111){printf("长度比较结果是%d\n",l);}else printf("两字符串完全相同!");break;case '4':xh=(HString *)malloc(sizeof(HString));ch=(HString *)malloc(sizeof(HString));StrCreat(xh);StrOut(xh);StrCreat(ch);StrOut(ch);concat(sh,*xh,*ch);StrOut(sh);break;case '5':StrCreat(&s);StrOut(&s);sub=(HString *)malloc(sizeof(HString));printf("取出的位置与长度:");scanf("%d%d",&a,&b);SubStr(sub,s,a,b);StrOut(sub);break;case '6':StrCreat(th);StrOut(th);StrCreat(sh);StrOut(sh);StrDelete(th,*sh);StrOut(th);break;case '7':printf("主串:\n");StrCreat(th);StrOut(th);printf("要找的字符:\n");StrCreat(sh);StrOut(sh);printf("第i个,i=\n");scanf("%d",&c);l=Index(*th,*sh,c);printf("你找的字符所在位置为%d\n",l);break;case '8':StrCreat(th);StrOut(th);printf("插入的字符串:");StrCreat(sh);StrOut(sh);printf("插入位置");scanf("%d",&d);StrInsert(th,d,*sh);StrOut(th);break;case 'a':ss=LStrAssign();printStr(ss);break;case '9':/*ss=LStrAssign(); printStr(ss); printf("要替换的字符:"); ts=LStrAssign(); printf("替换成:");vs=LStrAssign(); StrReplace(ss,*ts,*vs); printf("替换后的字符串是:"); printStr(ss);*/StrCreat(th);StrOut(th);printf("要替换的字符:");StrCreat(sh);ch=(HString *)malloc(sizeof(HString));printf("替换成:");StrCreat(ch);StrReplace(th,*sh,*ch);printf("替换后的字符串是:");StrOut(th);break;case 'b':StrCreat(th);StrOut(th);StrCopy(sh,th);StrOut(sh);break;case '0':return;}printf("\n\n\t\t==按任意键返回主菜单==\n\t\t");fflush(stdin);scanf("%c",&chs);}while(choice!='0');}