#include <stdlib.h>
#define MAXSIZE 80
typedef struct String
{
char data[MAXSIZE];
int size;
}String,*string;
void InitStr(string str)
{
char ch;
if(str==NULL)
{
str=(string)malloc(sizeof(String));
}
scanf("%c",&ch);
str->size=0;
while(ch!='/n'&&str->size<MAXSIZE)
{
str->data[str->size]=ch;
str->size++;
scanf("%c",&ch);
}
str->data[str->size]='/0';
}
void StrAssign(string str,char* s)
{
int i=0;
char* p;
p=s;
while(*p!='/0')
{
str->data[i]=*p;
i++;
p++;
}
str->data[i]='/0';
str->size=i;
}
void StrCopy(string str,string source)
{
int i=0;
str->size=source->size;
while(i<source->size)
{
str->data[i]=source->data[i];
i++;
}
str->data[i]='/0';
}
int StrEmpty(string str)
{
return !(!(str->size));
}
int StrCompare(string str,string str2)
{
int i;
int res;
i=0;res=0;
while(i<str->size&&i<str2->size)
{
if(str->data[i]==str2->data[i])
{
i++;continue;
}
if(str->data[i]>str2->data[i])
{
res=1;
return res;
}
else
{
res=-1;
return res;
}
}
if(str->size==str2->size)
return res;
if(str->size>str2->size)
return 1;
else
return -1;
}
int StrLength(string str)
{
return str->size;
}
void ClearString(string str)
{
str->data[0]='/0';
str->size=0;
}
void Concat(string des,string src1,string src2)
{
int i;
des->size=src1->size+src2->size;
for(i=0;i<src1->size;i++)
{
des->data[i]=src1->data[i];
}
for(i=0;i<src2->size;i++)
{
des->data[src1->size+i]=src2->data[i];
}
des->data[des->size]='/0';
}
void SubString(string res,string src,int pos,int len)
{
int i;
if(pos<=0||pos+len>src->size)
{
printf("Illegal pos!Out of range/n");
return ;
}
res->size=len;
for(i=0;i<len;i++)
{
res->data[i]=src->data[pos+i];
}
res->data[i]='/0';
}
int Index(string src,string res,int pos)
{
int i,j,flag;
if(pos<=0||pos+res->size>src->size)
{
printf("Illegal pos!Out of range/n");
return -1;
}
for(i=pos;i+res->size<=src->size;i++)
{
flag=1;
for(j=0;j<res->size;j++)
{
if(res->data[j]!=src->data[j+i])
{
flag=0;
break;
}
}
if(flag==1)
break;
}
if(flag==1)
return i+1;
else
return -1;
}
void StrInsert(string src,string news,int pos)
{
int len;
int i,j;
len=news->size;
if(pos>src->size||pos<0)
{
printf("Wrong position,Insert failed./n");
return ;
}
for(i=src->size;i>=pos;i--)
{
src->data[i+len]=src->data[i];
}
for(j=0;j<len;j++)
{
src->data[pos+j]=news->data[j];
}
}
void StrDelete(string src,int pos,int len)
{
int i,j;
for(i=pos;i<=src->size-len;i++)
{
src->data[i]=src->data[i+len];
}
}
void Replace(string src,string olds,string news)
{
int i,j,k=0,cnt=0;
int pos[80];
i=1,j=0;
while(i<src->size&&k!=-1)
{
k=Index(src,olds,i);
pos[j++]=k;
cnt++;
i=olds->size+k;
}
if(pos[0]==-1)
{
printf("No string /"%s/" is found,so no string is replaced./n",olds);
return ;
}
printf("%d string /"%s/" is replaced by /"%s/"/n",cnt-1,olds,news);
i=0;
printf("It's found at these position:/n");
while(pos[i]!=-1)
{
printf("%d/t",pos[i]) ;
i++;
}
for(i=cnt-2;i>=0;i--)
{
StrDelete(src,pos[i]-1,olds->size);
StrInsert(src,news,pos[i]-1);
}
printf("/n");
}
void Print(string str)
{
if(str->size==0)
{
printf("String is Empty!/n");
return ;
}
printf("%s/n",str->data);
}
int main()
{
string ms;
string name;
string name2;
int length;
ms=(string)malloc(sizeof(String));
name=(string)malloc(sizeof(String));
name2=(string)malloc(sizeof(String));
InitStr(ms);
InitStr(name);
InitStr(name2);
/*
StrCopy(name2,name);
StrDelete(ms,5,3);
Print(ms);
StrInsert(ms,name,4);
Print(ms);
ClearString(name);
Print(name);
StrAssign(name,"hzy");
Print(name);
Concat(name2,ms,name);
Print(name2);
SubString(name,name2,4,5);
Print(name);
length=StrLength(name2);
printf("name2's length is %d/n",length);
printf("Hello, world/nsize is %d/n",ms->size);
*/
/*
length=StrCompare(name2,name);
if(length==0)
printf("Equal/n");
else if(length==-1)
printf("%s is lower than %s/n",name2,name);
else
printf("%s is bigger than %s/n",name2,name);
length=StrCompare(name2,ms);
if(length==0)
printf("Equal/n");
else if(length==-1)
printf("%s is lower than %s/n",name2,ms);
else
printf("%s is bigger than %s/n",name2,ms);
length=Index(ms,name,5);
if(length==-1)
printf("%s is not found in %s start from %d/n",name,ms,5);
else
printf("%s is found in %s at position %d/n",name,ms,length);
length=Index(ms,name,8);
if(length==-1)
printf("%s is not found in %s start from %d/n",name,ms,8);
else
printf("%s is found in %s at position %d/n",name,ms,length);
*/
Replace(ms,name,name2);
Print(ms);
getch();
return 0;
}