该实现需提前给定定长的存储空间,手动实现增强一下字符串相关函数的原理理解。
使用提前申请好的顺序空间来存储字符串中的每个字符,并在这个基础上完成一系列字符串的操作。
(个人感觉就是自己实现一个字符串数组的处理)
头文件:SequenceString.h
PS:在该头文件中#include "Status.h" 中主要包含一些逻辑常量(SUCCESS、FALSE、ERROR、OK),并定义了数据类型Status(typedef后的int)。
#ifndef SEQUENCESTRING_H_INCLUDED
#define SEQUENCESTRING_H_INCLUDED
#include<stdio.h>
#include<string.h>
#include"Status.h"
#define MAXSTRLEN 255 //顺序穿最大串长
typedef unsigned char SString[MAXSTRLEN+1]; // 0号单元存放串的长度 将SString定义为一个字符串数组
Status StrAssign_Sq(SString T , const char *chars);
//生成一个其值等于常量chars的串T(串赋值)
void StrCopy_Sq(SString T,SString S);
//由串S复制得到串T
Status StrEmpty_Sq(SString S);
int StrCompare_Sq(SString S , SString T);
//
int StrLength_Sq(SString S);
void ClearString_Sq(SString S);
Status Concat_Sq(SString T , SString S1 , SString S2);
//用T返回由S1和S2连接而成的新串
Status SubString_Sq(SString Sub , SString S , int pos , int len);
//用Sub返回串S的第pos个字符起长度为len的字串.
int Index_Sq_1(SString S , SString T , int pos);
//返回T在S中第Pos个字符后第一次出现的位置,不存在则返回0.
Status Replace_Sq(SString S , SString T , SString V);
//用V替换主串S中出现的所有与T相等的不重叠的字串,可以被完全替换返回OK
Status StrInsert_Sq(SString S , int pos , SString T);
//在串S的第pos个字符之前插入串T,可以完全插入返回OK,否则返回ERROR
Status StrDelete_Sq(SString S , int pos , int len);
//从串S中删除第pos个字符起长度为len的字串
void DestroyString_Sq(SString S);
//销毁串S
void StrPrint_Sq(SString S);
//输出串S
#endif // SEQUENCESTRING_H_INCLUDED
具体实现:SequenceString.c
#include"SequenceString.h"
Status StrAssign_Sq(SString T,const char *chars)
{
int len = strlen(chars);
if(len>MAXSTRLEN)
{
return ERROR;
}
else
{
int i ;
T[0] = len;
for(i = 0;i < len;i++ )
{
T[i+1] = chars[i];
}
return SUCCESS;
}
}
void StrCopy_Sq(SString T,SString S)
{
int i;
for(i = 0;i<=S[0];i++)
{
T[i] = S[i];
}
}
Status StrEmpty_Sq(SString S)
{
if(S[0]==0)
{
printf("this Str is Empty!\n");
return YES;
}
else
{
printf("this Str is not Empty!\n");
return ERROR;
}
}
int StrCompare_Sq(SString S,SString T)
{
int i =1;
while(S[i]==T[i]&&i<=S[0]&&i<=T[0])
{
i++;
}
//退出循环:第i项不相等、S或T至少有一个越界
if(i>S[0]&&i>T[0])
{
printf("they are same!\n");
return 0;
}
if(i>S[0])
{
printf("the second is bigger than the first!\n");
return -1;
}
if(i>T[0])
{
printf("the first is bigger than the second!\n");
return 1;
}
if(S[i]>T[i])
{
printf("the first is bigger than the second!\n");
return 1;
}
else
{
printf("the second is bigger than the first!\n");
return -1;
}
}
int StrLength_Sq(SString S)
{
return S[0];
}
void ClearString_Sq(SString S)
{
S[0] = 0;
}
Status Concat_Sq(SString T,SString S1,SString S2)
{
int tmp = (int)S1[0]+ (int)S2[0];
if(tmp>MAXSTRLEN)
{
printf("链接字符串长度超出限制!\n");
return ERROR;
}
int tmp0 = S1[0];
T[0] = (unsigned char ) tmp;
int i;
for(i = 1;i<=tmp0;i++)
{
T[i] = S1[i];
}
for( ; i<=T[0] ; i++)
{
T[i] = S2[i-tmp0];
}
return SUCCESS;
}
Status SubString_Sq(SString Sub,SString S,int pos,int len)
{
if(pos+len-1>MAXSTRLEN)
{
printf("字符串没有这么长!\n");
return ERROR;
}
Sub[0] = len;
int i = 1;
for( ; i<=len ; i++)
{
Sub[i] = S[pos+i-1];
}
return SUCCESS;
}
int Index_Sq_1(SString S , SString T,int pos)
{
int Tlength = T[0] , Slength = S[0];
if(!Tlength||!Slength)
{
printf("两个串都不能为空!\n");
return ERROR;
}
if(Tlength>Slength-pos+1)
{
printf("子串不能长于目标主串!\n");
return 0;
}
SString tmp;
int i ;
for(i=pos;i<=Slength-Tlength+1;i++)
{
SubString_Sq(tmp , S ,i,Tlength);
if(!StrCompare_Sq(tmp,T))
{
return i;
}
}
printf("未找到该字串!\n");
return 0;
}
int Index_Sq_2(SString S , SString T , int pos)
{
int count = 0;
int Tlength = T[0] , Slength = S[0];
if(!Tlength||!Slength)
{
printf("两个串都不能为空!\n");
return ERROR;
}
if(Tlength>Slength)
{
printf("子串不能长于主串!\n");
return 0;
}
SString tmp;
int i ;
for(i=1;i<=Slength-Tlength+1;i++)
{
SubString_Sq(tmp , S ,i,Tlength);
if(!StrCompare_Sq(tmp,T))
{
count = i;
}
}
if(!count)
{
printf("未找到该字串!\n");
return 0;
}
else
{
return count ;
}
}
Status Replace_Sq(SString S,SString T,SString V)
{
int i=1 ,itmp =1;
SString tmp;
tmp[0] = 0;
SString stringTmp;
stringTmp[0] = 0;
while(i<S[0])
{
i=Index_Sq_1(S,T,i);
printf("\ni is:%d\n",i);
if(i == 0)
{
SubString_Sq(stringTmp , S ,itmp,S[0]-itmp+1);
Concat_Sq(tmp,tmp,stringTmp);
printf("查找结束!\n");
break;
}
SubString_Sq(stringTmp,S,itmp,i-1);//先找出前面的字符串
Concat_Sq(tmp,tmp,stringTmp);//给tmp加一个strTmp
Concat_Sq(tmp,tmp,V); //给tmp加一个V
printf("now the tmp is:");
ShowSString(tmp);
i=i+T[0];
itmp = i;
}
StrCopy_Sq(S,tmp);
}
Status StrInsert_Sq(SString S,int pos,SString T)
{
if(S[0]+T[0]>MAXSTRLEN)
{
printf("失败!容量不足!\n");
return ERROR;
}
SString tmp;
tmp[0] = 0;
SString stringTmp;
stringTmp[0] = 0;
SubString_Sq(stringTmp,S,1,pos-1);
Concat_Sq(tmp,tmp,stringTmp);
Concat_Sq(tmp,tmp,T);
SubString_Sq(stringTmp,S,pos,S[0]-pos+1);
Concat_Sq(tmp,tmp,stringTmp);
StrCopy_Sq(S,tmp);
}
Status StrDelete_Sq(SString S,int pos,int len)
{
SString tmp ,stringTmp;
tmp[0]=0,stringTmp[0] =0;
if(pos+len-1>MAXSTRLEN)
{
printf("串的总长度不够!\n");
return ERROR;
}
SubString_Sq(stringTmp,S,1,pos-1);
Concat_Sq(tmp,tmp,stringTmp);
SubString_Sq(stringTmp,S,pos+len,S[0]-pos-len+1);
Concat_Sq(tmp,tmp,stringTmp);
StrCopy_Sq(S,tmp);
return SUCCESS;
}
void ShowSString(SString S)
{
int i;
for(i=1;i<=S[0];i++)
{
printf("%c",S[i]);
}
printf("\n");
}
具体的测试main函数大家可以自己写一写。