#include<stdio.h>
#include<malloc.h>
#include<string.h>
//串的堆分配存储结构
typedef struct {
char *ch;
int length;
}heap;
//串赋值
int str_assign(heap *str, char *chars)
{
int count;
char * c;
int i;
//若串str已经存在,则释放所占空间
printf("%s\n", chars);
// if (str->ch == NULL)
// printf("null\n");
// free(str->ch); /*问题所在,不能释放未知指向的指针所占内存空间,但该怎么办?防止内存泄漏*/
i = strlen(chars);
printf("str_assign i:%d\n", i);
if ( i== 0)
{
str->ch = NULL;
str->length = 0;
}
else
{
if ( !(str->ch = (char*)malloc(i * sizeof(char))) )
return -1;
strcpy(str->ch, chars); //把chars复制到str中去
str->length = i;
}
return 0;
}
//串连接
int str_concat(heap *dest, heap src1, heap src2)
{
//if(dest->ch)
// free(dest->ch);
if( !(dest->ch = (char*)malloc( (src1.length + src2.length) * sizeof(char) )))
return -1;
strcpy(dest->ch, src1.ch);
strcat(dest->ch, src2.ch);
dest->length = src1.length + src2.length;
return 0;
}
//模式匹配
int sub_str(heap s, heap t, int pos)
{
int i, j;
i = pos;
j = 0;
while(i < s.length && j < t.length)
{
if(s.ch[i] == t.ch[j])
{
i++;
j++;
}
else{
i = i - j + 1;
j = 0;
}
}
if(j >= t.length)
return (i - t.length);
return -1;
}
int main()
{
char * text1 = "fengzhi is trying to do something that never happened.";
char * text2 = "yeah, I've heard about it.";
heap str1, str2, str3;
printf("?1\n");
str_assign(&str1, text1);
str_assign(&str2, text2);
printf("str1:\n");
puts(str1.ch);
printf("\n");
printf("str2:\n");
puts(str2.ch);
printf("\n");
printf("str_concat\n");
str_concat(&str3, str1, str2);
printf("str3:\n%s\n", str3.ch);
printf("index:%d\n", sub_str(str1, str2, 2));
return 0;
}
在重新学习的过程中遇到了些问题,比如内存空间的释放,能否释放一个未知指向的指针所占的内存?另外,在<string.h>头文件内包含一些系统函数strcat,strcpy,strstr, strcmp,strlen可以完成串的基本操作,是否真的有必要构造一些函数来完成类似的功能?能够充分利用库函数应该是程序员应具备的素质吧。
问题有待解决。
转载于:https://blog.51cto.com/slientradio/1390982