#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef int status;
typedef struct {
char *ch;
int length;
}hstring;


//生成一个其值等于串常量的串
status strassign(hstring &t,char chars[])
{
int i,j;
char *c;
if(t.ch) free(t.ch);
for(i=0,c=chars;*c;i++,c++);

if(!i)
{
t.ch=NULL;
t.length=0;
}

else
{
if(!(t.ch=(char*)malloc(i*sizeof(char))))
exit(OVERFLOW);
for(j=0;j<=i-1;j++)
{
t.ch[j]=chars[j];
}
t.length=i;
}
return OK;
}



//返回元素个数称为串的长度
int strlength(hstring s)
{
return s.length;
}

//若S>T 返回大于0 S=T 返回等于0 S<T 返回小于0
int strcompare(hstring s,hstring t)
{
int 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;
}

//将串清空
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)
{
if(t.ch) free(t.ch);
int i,j;
char c;
if(!(t.ch=(char*)malloc((s1.length+s2.length)*sizeof(char))))
exit(OVERFLOW);
for(i=0;i<s1.length;i++)
{
t.ch[i]=s1.ch[i];
}
t.length=s1.length+s2.length;
for(i=s1.length,j=0;i<t.length;i++,j++)
{
t.ch[i]=s2.ch[j];
}
return OK;
}

//用sub返回S中的第POS个字符起的长度为len的字串
status substring(hstring &sub,hstring s,int pos,int len)
{
int j;
if(pos<1||pos>s.length||len<0||len>s.length-pos+1)
return ERROR;
if(sub.ch) free(sub.ch);
if(!len)
{
sub.ch=NULL;
sub.length=0;
}
else
{
sub.ch=(char*)malloc(len*sizeof(char));
for(j=0;j<=len-1;j++)
{
sub.ch[j]=s.ch[pos-1+j];
}
sub.length=len;
}
}

status strprint(hstring s)
{
int i;
for(i=0;i<s.length;i++)
{
printf("%c",s.ch[i]);
}
return OK;
}

int main()
{

char c1[10],c2[10];
hstring t1,t2,t;
status len,pos; //为什么加上这句不能正常运行了 不能赋初值

printf("请输入一个串");
scanf("%s",c1);


if(strassign(t1,c1))
{
printf("生成成功!");
}

scanf("%s",c2);
if(strassign(t2,c2))
{
printf("生成成功!");
}
printf("\n");

//用sub返回S中的第POS个字符起的长度为len的字串
printf("请输入要返回的位置和长度:");
scanf("%d%d",&pos,&len);
if(substring(t,t1,pos,len))
{
printf("success!");
printf("%s",t);
}

printf("\n");
//返回元素个数称为串的长度
if(strlength(t1))
{
printf("计算长度成功!");
printf("%d",len);
}
printf("\n");


///为什么上面两个函数的顺序不能换呢


//连接成新串
if(concat(t,t1,t2))
{
printf("连接成功!");
strprint(t);
}
printf("\n");
return OK;
}