#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可以完成串的基本操作,是否真的有必要构造一些函数来完成类似的功能?能够充分利用库函数应该是程序员应具备的素质吧。
问题有待解决。
原文:http://slientradio.blog.51cto.com/7241495/1390982