#include<stdio.h>
#include<stdlib.h>
//typedef int Status;
#define Max 20
#define OK 1
#define ERROR 0
#define OVERLOE -2
typedef struct//堆分配表示串
{
?char *ch;
?int length;
}HString;
//===================================================================
int CreatHString(HString &H)//構造字符串
{
?H.length = 0;
?H.ch = (char *)malloc(Max*sizeof(char));
?for (int i = 0; i < Max; i++)
?{
? H.ch[i]=getchar();
? H.length++;
? if (getchar() == '\n')
?? break;
?}
?return OK;
}//CreatHString
//===================================================================
int PrintHString(HString H)//輸出所輸入的字符串
{
?if (H.length == 0)
?{
? printf( "空串!" );
? return ERROR;
?}
?else
? for (int i = 0; i < H.length; i++)
?? printf("%c",H.ch[i]);
? printf("\n");
?return OK;
}//PrintHString
//===================================================================
int HStringLength(HString H)//求字符串的長度
{
?printf( "您輸入的字符串長度為:" );
?printf("??? %d ",H.length);
?return OK;
}//HStringLength
//===================================================================
int HStringCompare(HString H, HString T)//求兩個字符串長度差(絕對值)
{
printf( "兩個字符串的長度差為:" );
?int L;
? L = H.length - T.length;
?if (L<0)
?printf("%d",-L);
?if (L>=0)
?printf("%d",L);
?return OK;
}//HStringCompare
//===================================================================
int ConcatHString(HString &S, HString H, HString T)//鏈接H和T
{
?if (!(S.ch = (char *)malloc((H.length + T.length)*sizeof(char))))
? exit(OVERLOE);
?for (int i = 0; i < H.length; i++)
? S.ch[i] = H.ch[i];
?S.length = H.length + T.length;
?for (int j = H.length; j < S.length; j++)
? S.ch[j] = T.ch[j-H.length];
?return OK;
}//ConcatHString
//===================================================================
int SubHString(HString &Sub, HString S, int pos,int len)
{//用Sub返回串S的第pos個字符起長度為len的子串
?if (pos<1 || pos>S.length)
?{
? printf( "輸入的位置有誤!" );
? return ERROR;
?}
?if (len<0 || len>S.length - pos + 1)
?{
? printf( "輸入的長度有誤!" );
? return ERROR;
?}
?if (!len)
?{
? Sub.ch = NULL;
? Sub.length = 0;
?}
?else
?{
? Sub.ch = (char *)malloc(len*sizeof(char));
? for (int i = 0; i < len ; i++)
?? Sub.ch[i] = S.ch[pos + i - 1];
? Sub.length = len;
?}
?return OK;
}//SubHString
//===================================================================
int ClearHString(HString &H)//將H清為空串
{
?if (H.ch)
?{
? free(H.ch);
? H.ch = NULL;
?}
?H.length = 0;
?return OK;
}//ClearHString
//===================================================================
void main()
{
?HString S,H,T;
?printf( "請輸入一個字符串(按回車鍵結束):" );
?CreatHString(H);
?printf("現在串中的字符為:" );
?PrintHString(H);
?HStringLength(H);
?printf( "請再輸入一個字符串(按回車鍵結束):" );
?CreatHString(T);
?HStringCompare(H, T);
?ConcatHString(S, H, T);
?printf("現在串中的字符為:" );
?PrintHString(S);
?HString Sub;
?int pos, len;
?printf( "請輸入截取位置pos及長度len:" );
?scanf( "%d%d",&pos,&len);
?SubHString(Sub, S, pos, len);
?printf( "截取的子串為:" );
?PrintHString(Sub);
?ClearHString(S);
?printf ("檢驗S清空后是否為空:" );
?PrintHString(S);
}//main
?