#include <stdio.h>
#include<stdlib.h>
#define Error 0
#define Ok 1
typedef int Status;
typedef struct {
char *ch;
int length;
}HString; //堆分配的结构体定义
Status StrAssign(HString &T,char *chars){ //生成一个值等于数组chars的t串
int i,j;
i=sizeof(chars)/sizeof(char); // 取得数组chars的长度
T.ch=(char*)malloc(i*sizeof(char));
for(j=0;j<i;j++)
T.ch[j]=chars[j];
T.length=i;
return Ok;
}
int Length(HString s)
{
return s.length;
}
Status ClearString(HString &s) //清除串
{
if(s.ch) {free(s.ch) ; s.ch=NULL;}
s.length=0;
return Ok;
}
Status Concat(HString &T,HString s1,HString s2){ //将两个串合并为一个串
int i,j;
if(T.ch) {free(T.ch);T.ch=NULL;}
T.ch=(char*)malloc((s1.length+s2.length)*sizeof(char));
for(i=0;i<s1.length;i++)
T.ch[i]=s1.ch[i];
for(j=0;j<s2.length;j++)
T.ch[i+j]=s2.ch[j];
T.length=s1.length+s2.length;
return Ok;
}
Status SubString(HString &T,HString s,int pos,int len) //截取子串
{
int i,j;
if((pos>s.length||pos<1)&&(len<0&&len>s.length-pos+1)) //如果要求的位置pos和长度len不合法,那么退出
return Error;
if(!len) {T.ch=NULL;T.length=0;}
else
{
T.ch=(char*)malloc(len*sizeof(char));
for(i=pos,j=0;j<len;i++,j++)
T.ch[j]=s.ch[i];
T.length=len;
}
return Ok;
}
void print(HString T)
{
int i;
for(i=0;i<T.length;i++)
printf("%c",T.ch[i]);
printf("\n");
}
void main()
{
HString S,T1,T2,T3,T4;
int pos,len;
char chars[]={'a','b','c','d'};
char charss[]={'e','r','t','y'};
printf("取得第一个和第二个的串为:");
StrAssign(T1,chars);
StrAssign(T2,charss);
print(T1);
print(T2);
printf("请输入取第一个串的子串的初始位置和子串的长度");
scanf("%d,%d",&pos,&len);
SubString(S,T1,pos,len);
printf("串一的子串为:");
print(S);
getchar();
getchar();
}
堆分配个人感觉就是按照顺序表的形式来存储和操作串的