今天写了一下串的一些常用的库函数的自定义版本。比如strlen(),strcpy(),char *strcat(char *,char *),strstr(char *,char *)等函数。下面是我的代码,当然可能与标准函数库STL中提供的库函数功能有所不同。但大致的内容是一样的,只是细节可能不同而已。
下面是代码:
//串的表示、实现和基本操作
//求串长StrLength()\ 插入运算StrInsert(),从pos处插入子串T
//子串删除StrDelete()\串连接StrCount()\去子串SubString()
//串复制函数Strcpy()
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Max 25
typedef char Str[Max+1];
typedef struct seq
{
Str str;
int len;
}*Seqstring,seq;
bool Is_empty(Seqstring S){ //判空
return S->len==0;
}
bool Is_full(Seqstring S){ //判满
return S->len==Max;
}
int StrLength(Seqstring S){ //求串长度(特殊情况为当输入的串超过了实际定义的最大长度时,返回最大长度值Max)
int count=0;
int i=0;
while(S->str[i]){
i++;
count++;
if(count==Max)
return count;
}
return count;
}
void Strcpy(Seqstring S,Seqstring T){ //串拷贝函数
for(int i=0;i<T->len;i++)
S->str[i]=T->str[i];
S->str[T->len]='\0';
S->len=T->len;
}
void StrInsert(Seqstring S,int pos,Seqstring T){ //串插入函数,实现的具体功能是:当串S非空,且不满,且插入位置在0—strlen(s)-1范围内,且插入串的长度与S串的长度之和 不能超过Max,从下标为pos开始插入串T.
if(Is_empty(S)){
printf("the Seqstring is empty\n");
Strcpy(S,T);
return ;
}
if(Is_full(S)){
printf("Sorry!you cannot Insert for the Seq is full\n");
return ;
}
if(S->len+T->len>Max){
printf("wrong operator\n");
return ;
}
if(pos<0 || pos>S->len-1){
printf("wrong location\n");
return ;
}
int i;
for(i=S->len+T->len-1;i>=pos+T->len;i--)
S->str[i]=S->str[i-T->len];
for(i=pos;i<=pos+T->len-1;i++)
S->str[i]=T->str[i-pos];
S->len+=T->len;
S->str[S->len]='\0';
}
void StrDelete(Seqstring S,int pos,int l){ //串删除函数,串不能为空,且插入位置在0-strlen(S)范围内,从下标为pos开始删除l个字符。
if(Is_empty(S)){
printf("the Seq is empty\n");
return ;
}
if(pos<0 || pos>S->len-1){
printf("wrong operator\n");
return ;
}
if(S->len-pos<=l){
S->str[pos]='\0';
S->len=pos;
return ;
}
else{
for(int i=pos+l;i<S->len;i++)
S->str[i-l]=S->str[i];
S->len-=l;
S->str[S->len]='\0';
}
}
void StrCat(Seqstring S,Seqstring T){ //串连接函数,条件是两串长度之和不能超过Max,将T串连接到S串末尾
if(S->len+T->len>Max){
printf("wrong operation\n");
return;
}
int i;
for(i=S->len;i<=S->len+T->len-1;i++)
S->str[i]=T->str[i-S->len];
S->str[i]='\0';
S->len+=T->len;
}
Seqstring Strstr(Seqstring S,int pos,int l){ //串查找函数,条件,串不能为空,且查找初始位置在0-strlen(S)-1范围内,则从下标为pos开始查找l长度的字符,并返回查找串的指针(地址)。
if(Is_empty(S)){
printf("the Seq is empty\n");
return NULL;
}
if(pos<0 || pos>S->len-1){
printf("wrong operation\n");
return NULL;
}
if(S->len-pos<=l){
Seqstring p=(Seqstring)malloc(sizeof(seq));
for(int i=pos;i<=S->len-1;i++)
p->str[i-pos]=S->str[i];
p->len=S->len-pos;
p->str[p->len]='\0';
//printf("%s\n",p->str);
return p;
}
else{
Seqstring q=(Seqstring)malloc(sizeof(seq));
for(int i=pos;i<=pos+l-1;i++)
q->str[i-pos]=S->str[i];
q->len=l;
q->str[l]='\0';
//printf("%s\n",q->str);
return q;
}
}
//测试函数
int main()
{
seq s;
Seqstring p=&s,q;
printf("输入串\n");
scanf("%s",p->str);
getchar();
p->len=StrLength(p);
if(p->len==Max)
p->str[Max]='\0';
while(true){
printf("提供如下操作 \
1--------求长度\
2--------复制串 \
3--------插入子串\
4--------删除字串\
5--------拼接串\
6--------查找串\
7--------退出\n");
switch(getchar())
{
case '1':
getchar();
printf("串长度为%d\n",StrLength(p));
break;
case '2':
getchar();
q=(Seqstring)malloc(sizeof(seq));
printf("请输入新串\n");
scanf("%s",q->str);
getchar();
Strcpy(q,p);
printf("拷贝后的串为:%s\n",q->str);
free(q);
break;
case '3':
getchar();
q=(Seqstring)malloc(sizeof(seq));
printf("输入你想插入的串:\n");
scanf("%s",q->str);
q->len=StrLength(q);
if(q->len==Max)
q->str[Max]='\0';
printf("输入你想插入的位置:\n");
int *ppos;
ppos=new int;
scanf("%d",ppos);
getchar();
printf("插入前的串为:%s\n",p->str);
StrInsert(p,*ppos,q);
printf("插入后的串为:%s\n",p->str);
free(q);
delete ppos;
break;
case '4':
getchar();
printf("原字符串为:%s\n",p->str);
int *pos;
pos=new int;
int *Len;
Len=new int;
printf("请输入你想删除的位置和长度:\n");
scanf("%d%d",pos,Len);
getchar();
StrDelete(p,*pos,*Len);
printf("删除后的串为:%s\n",p->str);
delete pos;
delete Len;
break;
case '5':
getchar();
printf("原字符串为:%s\n",p->str);
q=(Seqstring)malloc(sizeof(seq));
printf("请输入你想连接的串:\n");
scanf("%s",q->str);
getchar();
q->len=StrLength(q);
if(q->len==Max)
q->str[Max]='\0';
StrCat(p,q);
printf("连接后的串为:%s\n",p->str);
free(q);
break;
case '6':
getchar();
printf("原字符串为:%s\n",p->str);
int *Pos;
Pos=new int;
int *len;
len=new int;
printf("请输入你想查询的位置和长度\n");
scanf("%d%d",Pos,len);
getchar();
q=Strstr(p,*Pos,*len);
printf("查询后的串为:%s",q->str);
free(q);
delete Pos;
delete len;
break;
case '7':
getchar();
printf("do you really want to exit Y/N\n");
switch(getchar())
{
case 'Y':case 'y': getchar();exit(0); break;
case 'N':case 'n': getchar();break;
}
break;
}
}
return 0;
}