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的串T
int StrLength(HString S);//返回S的元素个数
int StrCompare(HString S,HString T);//两个串比较输出两串的长度差//如果两串相同,则输出111
void 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个字符之前插入串T
void 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)//两个串比较输出两串的长度差
{ //如果两串相同,则输出111
int 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个字符之前插入串T
int 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]);
}//for
printf("\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');
}