#include<stdio.h>
#include<stdlib.h>
#define Status int
#define TRUE 1
#define FALSE 0
typedef struct{
char *ch; //分配堆空间首地址
int length; //串长
}HString;
//用字符串常量初始化S
int StrAssign(HString *S, const char *chars)
{
int i=0,j;
const char *c=chars;
while(*c)
{
++i;
c++;
}
if(!i)
{
S->ch=NULL;
S->length=0;
}
else
{
S->ch=(char *)malloc(i*sizeof(char));
if(!S->ch)return 0;
for(j=0;j<i;j++)
{
S->ch[j]=chars[j];
}
}
S->length=i;
return 1;
}
//用变量初始化S
int StrAssign(HString *S, char *chars)
{
int i=0,j;
char *c=chars;
while(*c) //求chars的长度i
{
i++,c++;
}
if(i==0)
{
S->ch=NULL,S->length=0;
}
else
{
S->ch=(char *)malloc(i*sizeof(char));
if(!S->ch)return 0;
for(j=0;j<i;j++)
S->ch[j]=chars[j];
}
S->length=i;
return 1;
}
//比较串S和串T,S>T返回值>0,相等返回0,S<T返回值小于0
int StrCompare(HString S,HString T)
{
int len,i;
for(i=0;i<=S.length && i<=T.length;i++)
{
if(S.ch[i]!=T.ch[i])return S.ch[i]-T.ch[i];
}
return S.length-T.length;
}
//返回串S的第pos个字符起长度为len的子串
int SubString(HString *Sub,HString S,int pos,int len)
{
int i;
if(pos<1 || pos>S.length || len<0 || len>S.length-pos+1)
return 0;
Sub->ch=(char*)malloc(len*sizeof(char));
if(!Sub->ch) return 0;
for(i=0;i<len;i++)
Sub->ch[i]=S.ch[pos+i];
Sub->length=len;
return 1;
}
//用T返回S1和S2组成的字符串
int Concat(HString *T,HString S1,HString S2)
{
int i;
T->ch=(char*)malloc((S1.length+S2.length)*sizeof(char));
if(!T->ch)return 0;
for(i=0;i<S1.length;i++)
{
T->ch[i]=S1.ch[i];
}
for(i=0;i<S2.length;i++)
{
T->ch[S1.length+i]=S1.ch[i];
}
T->length=S1.length+S2.length;
return 1;
}
void StrDisplay(HString S)
{
int i;
for(i=0;i<S.length;i++)
{
printf("%c",S.ch[i]);
}
}
//求串的长度
int StrLength(HString S){
return S.length;
}
//清空串
int ClearString(HString *S){
if(S->ch)
{
free(S->ch);
S->ch=NULL;
}
S->length=0;
return 1;
}
//在串的第pos个字符之前插入串T,即pos位开始元素往后移动
int StrInsert(HString *S,int pos,HString T){
int i;
if(pos<1 || pos>S->length+1)
return 0;
if(T.length){
if(!(S->ch=(char*)realloc(S->ch,(S->length+T.length)*sizeof(char))))
return 0;
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[i+pos-1]=T.ch[i];
S->length+=T.length;
}
return 1;
}
int main()
{
HString S1,S2,T;
StrAssign(&S1,"Monkey King") ;
StrAssign(&S2,"Monkey ") ;
StrDisplay(S1);
printf("\n");
printf("%d",StrCompare(S1,S2));
printf("\n");
Concat(&T,S1,S2);
StrDisplay(T);
printf("\n");
int s = StrLength(S1);
printf("%d\n",s); // 求串长
ClearString(&S1);
printf("\n");
printf("我来查看一下清空后的S1的值:");
StrDisplay(S1);
/*
StrAssign(&S1,"Monkey King") ;
StrAssign(&S2,"Monkey ") ;
printf("\n我来向S1中插入一个串S2:");
printf("\n");
StrInsert(&S1,3,S2);
printf("\n");
StrDisplay(S2);
printf("\n");
StrDisplay(S1);*/
return 0;
}
注意:如果ClearString中的引用ch使用了’.’,则会报错
则此处需要使用‘->’来引用成员ch ,即:S->ch;
如果非指针类型的“HString”变量用‘->’来引用成员,则会报错
则对于非指针类型‘HString’引用结构成员的时候,只能用‘.’
最下面注释的那一段的运行结果