#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define bool int
#define true 1
#define false 0
typedef struct{
char *ch;
int length;
}HString;
bool assign(HString *t,char *chs)//生成串
{
int i=0;
char *c=chs,*d=chs;
while(c[i])//c不为空时进入循环
{
i++;//计算字符串常量chs的长度
}
if(!i)
{
t->ch=NULL;
t->length=0;
}
else{
t->ch=(char*)malloc(i*sizeof(char));
c=t->ch;
if(!t->ch)//如果没有申请到空间
return -1;
while(*chs)//chs不为空时进入循环
{
*c++=*chs++;
}
t->length=i;
}
return true;
}
int strLength(HString *s)//返回串长
{
return s->length;
}
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;
}
bool concat(HString *t,HString s1,HString s2)
{
int i=0,j=0;
if(!(t->ch=(char*)malloc((s1.length+s2.length)*sizeof(char))))
return false;
for (i;i<s1.length;i++)
{
t->ch[i]=s1.ch[i];
}
t->length=s1.length+s2.length;
for (i=s1.length;i<t->length;i++,j++)
{
t->ch[i]=s2.ch[j];
}
return true;
}
bool subString(HString *sub,HString s,int pos,int len)//用sub返回串的第pos个字符起的子串
{
sub->ch=(char*)malloc(s.length);
if(pos<0||pos>=s.length||len<0||len+pos > s.length)
return false;
if(sub->ch)free(sub->ch);
if(!len)
{
sub->ch=NULL;
sub->length=0;
}
else
{
int i=0;
sub->ch=(char*)malloc(len*sizeof(char));
for(;i<len;i++)
{
sub->ch[i]=s.ch[pos+i];
}
sub->length=len;
}
return true;
}
void printStr(HString *t)//输出串
{
int i=0;
while(i++<t->length)
{
putchar(t->ch[i-1]);
//printf("第%d个:%c/n",i-1,t->ch[i-1]);
}
putchar('/n');
}
int main()
{
HString s1,s2;
HString sub,newt;
char a[100],b[100];
int pos,slen;
puts("输入串s1:");
gets(a);
puts("输入串s2:");
gets(b);
assign(&s1,a);
assign(&s2,b);
printStr(&s1);
printStr(&s2);
concat(&newt,s1,s2);
printStr(&newt);
puts("输入子串起始位置:");
scanf("%d",&pos);
puts("输入子串长度:");
scanf("%d",&slen);
subString(&sub,newt,pos,slen);
printStr(&sub);
return 0;
}