堆分配字符串

dynamicString.h 文件

 

 

 

 


typedef int Status;

typedef struct {

char *ch;
int length;

}HString;


//初始化一个字符串
Status StrAssign(HString *S,char *chars);


//获取字符串的长度
int StrLength(HString S);

//比较两个字符串
int StrCompare(HString S1,HString S2);

//清空字符串
Status ClearString(HString *S);

//拼接两个字符串
Status Concat(HString *T,HString S1,HString S2);

//截取一个字符串的长度
Status SubString(HString *Sub,HString S,int pos,int len);

 

 dynamicString.c

 

 

 

#include "dynamicString.h"
#include "stdio.h"
#include "stdlib.h"


void main() {

char s[1000],s1[1000];
printf("请输入第一个字符串的值\n");
gets_s(s,1000);

//printf("请输入第二个字符串的值\n");
//gets_s(s1, 1000);

HString S,S1,S2,Sub;

S.ch = NULL;
S1.ch = NULL;
Sub.ch = NULL;
StrAssign(&S,s);

//StrAssign(&S1, s1);

//printf("输出字符串的值为\n");

//printf("%s\n",S.ch);

//printf("字符串的长度为%d\n",StrLength(S));

//printf("比较两个字符串%d\n",StrCompare(S,S1));

//合并两个字符串
//Concat(&S2,S,S1);

//printf("合并后的字符串为%s\n",S2.ch);

printf("截取后的字符串为\n");

SubString(&Sub,S,1,3);

printf("%s\n",Sub.ch);

 


}


//初始化一个字符串
Status StrAssign(HString *S, char *chars) {

if (S->ch != NULL)
{
free(S->ch);

}//如果空间已经开辟则先释放

int i = 0;
char *p,*p1;
p = chars;
while (*p!='\0')
{
p++;
i++;
}

if (!i) {
S->ch = NULL;
S->length = 0;
return 0;
}
else {
p = chars;
S->length = i;

S->ch = p1=(char *)malloc(i*sizeof(char));

while (*p!='\0')
{

*p1 = *p;
p++;
p1++;
}
*p1 = '\0';

}


}
//获取字符串的长度
int StrLength(HString S) {

return S.length;

}

//比较两个字符串(先判断字符是否相等然后比对字符串的长度)
int StrCompare(HString S1, HString S2) {

while ((*S1.ch!='\0')&&(*S2.ch!='\0'))
{
if (*S1.ch != *S2.ch) return *S1.ch - *S2.ch;

S1.ch++;
S2.ch++;

}
return S1.length-S2.length;

}

//清空字符串
Status ClearString(HString *S) {

S->length = 0;
free(S->ch);
S->ch = NULL;

return 1;

}

//拼接两个字符串
Status Concat(HString *T, HString S1, HString S2) {

T->length = S1.length + S2.length;
char *p;

T->ch = p = (char *)malloc(T->length*sizeof(char));
if (!p) {
return 0;
}

while (*S1.ch!='\0')
{
*p = *S1.ch;
S1.ch++;
p++;

}
while (*S2.ch != '\0')
{
*p = *S2.ch;
S2.ch++;
p++;

}
*p = '\0';

 

}

//截取一个字符串的长度
Status SubString(HString *Sub,HString S, int pos, int len) {

if (len < 0 || pos<1 || pos>S.length || len>S.length-pos+1 ) {
return 0;
}

char *p;

if (Sub->ch)free(Sub->ch);

Sub->ch = p = (char *)malloc(sizeof(char)*len);

Sub->length = len;

for (int i = 1; i <=len; i++)
{
*p = *(S.ch +pos+i-2);
p++;
}
*p = '\0';

 

}

 

posted on 2017-10-19 18:28  paulversion  阅读(79)  评论(0)    收藏  举报