您的位置:首页 > 编程语言

字符串编程,将字符串S中出现的子串T1用字符串T2替代。

2004-10-21 19:19 483 查看
/*字符串编程,将字符串S中出现的子串T1用字符串T2替代

ahebhechedhe
he
hello!
ahello!bhello!chello!dhello!
*/

/*静态数组实现*/
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>

#define MAXSTRLEN 255

typedef unsigned char SString[MAXSTRLEN + 1];
typedef int Status;

void StrAssign(SString &S,char *chars)
{//串赋值
int length = 0;
unsigned char * Sclient = S + 1;

while(*(chars))
{
*Sclient = *chars;
chars++;
Sclient++;
length++;
}
*Sclient = '/0';
S[0] = length;
}

void Display_String(SString S)
{//串显示
cout<<S + 1<<endl;
}

int Index(SString S, SString T, int Pos)
{//在串S中扫描子串T的位置值,如不存在子串T返回0
unsigned char *Sclient = S + 1;
int clientLen = 0;

if (Pos > S[0])
return -1;
T++;
while (*(Sclient))
{
while(*(T) == *(Sclient + Pos))
{
T++;
if (!*T)
return Pos;
clientLen++;
Sclient++;

}

Sclient = Sclient - clientLen;
Pos++;
}
return -1;
}
void Delete(SString &S, int pos, int len)
{//在串S中删去从pos位置开始的len个字符
S[0] -= len;
unsigned char * Sclient = S + 1;

while (*(Sclient + len + pos))
{
*(Sclient + pos) = *(Sclient + pos +len);
Sclient++;
}
*(Sclient + pos) = '/0';

}

void Insert(SString &S,int &pos,SString T)
{//在串S的pos位置插入子串T
int i;

if(pos != S[0])
{
for (i = 0; i < S[0] - pos; i++)
{
*(S + S[0] + T[0] - i) = *(S + S[0] - i);
}
}

for(i = 0; i < T[0]; i++)
{
S[pos + i + 1] = T[i + 1];
}
S[0] += T[0];
*(S + S[0] + 1) = '/0';
pos += T[0];
}

void Replace_SubString(SString &S, SString T1, SString T2)
{//通过对Index、Delete和Insert函数的调用,完成将串S中出现的子串T1用串T2替代
int pos = 0;
int posFlag = -1;

while (1)
{
pos = Index(S, T1, pos);

if (pos < posFlag)
break;
posFlag = pos;

Delete(S, pos, T1[0]);
Insert(S, pos, T2);
}
}

void main( void )
{
SString S, T1,T2;

StrAssign(S, "ahebhechedhe");

Display_String(S);

StrAssign(T1,"he");

Display_String(T1);

StrAssign(T2,"HELLO!");

Display_String(T2);

Replace_SubString(S,T1,T2);

Display_String(S);
}

/*用动态链表实现:*/
#include <stdio.h>
#include <stdlib.h>

#define MAXSTRLEN 255

typedef struct
{
char *ch;
int length;
} HString;

void StrAssign(HString &S, char *chars)
{
//串赋值
char* c;
int i, j;

if (!S.ch)
free(S.ch);

for (i = 0, c = chars; *c; c++, i++ );

if (!i)
{
S.ch = NULL;
S.length = 0;
}
else
{
if (!(S.ch = (char*)(malloc(sizeof(char) * i))))
return;

for (j = 0; j < i; j++)
S.ch[j] = chars[j];
}
S.length = i;

}

void Display_String(HString S)
{//串显示
if (S.ch == NULL)
return;
int i;
for(i = 0; i < S.length; i++)
printf("%c", S.ch[i]);
printf("/n");
}

int Index(HString S, HString T,int Pos)
{//在串S中扫描子串T的位置值,如不存在子串T返回0
int clientLen = 0;
char * Tclient = T.ch;

if (Pos >= S.length)
return -1;
char * Sclient = S.ch;
while ((Sclient - S.ch) <= S.length)
{
while(*(Tclient) == *(Sclient + Pos))
{
if ((Tclient - T.ch) < S.length)
return Pos;
Tclient++;
clientLen++;
Sclient++;
}
Sclient = Sclient - clientLen;
Pos++;
}

return -1;
}
void Delete(HString &S,int pos,int len)
{//在串S中删去从pos位置开始的len个字符
int i;

for (i = 0; i < (S.length - pos); i++)
S.ch[pos + i] = S.ch[pos + i + len];
S.length -= len;
}

void Insert(HString &S,int &pos,HString T)
{//在串S的pos位置插入子串T
S.ch = (char *)realloc(S.ch, T.length + S.length);
S.length += T.length;
int i;

if(pos != S.length)
{

for (i = 0; i < S.length - pos; i++)
{
*(S.ch + S.length + T.length-1 - i) = *(S.ch + S.length -1- i);
}
}

for(i = 0; i < T.length; i++)
{
S.ch[pos + i] = T.ch[i];
}
pos += T.length;

}

void Replace_SubString(HString &S, HString T1,HString T2)
{// 通过对Index、Delete和Insert函数的调用,完成将串S中出现的子串T1用串T2替代
int pos = 0;
int posFlag = -1;

while (1)
{
pos = Index(S, T1, pos);

if (pos < posFlag)
break;
posFlag = pos;

Delete(S, pos, T1.length);
Insert(S, pos, T2);
}

}

void main()
{
HString S, T1, T2;

StrAssign(S, "ahebhechedhe");

Display_String(S);

StrAssign(T1, "he");

Display_String(T1);

StrAssign(T2, "hello!");

Display_String(T2);

Replace_SubString(S,T1,T2);

Display_String(S);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐