在写这个串的定义的时候,觉得 有几点问题:1.各种释放内存, 2. 操作的效率 和步骤有点麻烦 3. 各种出错。
希望以后完善,
欢迎指出代码不足
// seqString.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdlib.h>
enum E_State
{
E_State_Error = 0,
E_State_Ok,
};
struct String
{
char * base;
int len;//串长度
};
void StringInit(String * s){
s->base = NULL;
s->len = 0;
}
void StringClear(String * s){
s->base = NULL;
s->len = 0;
}
void StringDestory(String * s){
free(s->base);
StringClear(s);
}
E_State StringAssign(String * to,const char * from){
int len = 0;
const char * p = from;
while (*p != '\0') {len++,p++;}
free(to->base);
if (len != 0)
{
to->base = (char *)malloc(sizeof(char)*len);
if (to->base == NULL)
{
return E_State_Error;
}
//赋值..
for (int i = 0; i < len; i++) to->base[i] = from[i];
to->len = len;
}
else
{
StringClear(to);
}
return E_State_Ok;
}
int StringLen(String s){
return s.len;
}
bool StringEmpty(String s){
return s.len == 0 ? true : false;
}
E_State StringCopy(String * to,String from){
int len = from.len;
free(to->base);
if (len != 0)
{
to->base = (char *)malloc(sizeof(char)*len);
if (to->base == NULL)
{
return E_State_Error;
}
//赋值..
for (int i = 0; i < len; i++) to->base[i] = from.base[i];
to->len = len;
}
else
{
StringClear(to);
}
return E_State_Ok;
}
int StringCmp(String s1,String s2){
int len1 = s1.len;
int len2 = s2.len;
for (int i = 0; i < len1 && i < len2; i++)
{
char c1 = s1.base[i];
char c2 = s2.base[i];
if (c1 != c2 )
{
return c1 - c2;
}
}
return len1 - len2;
}
E_State StringConcat(String * dst,String src1,String src2){
int len = src1.len + src2.len;
free(dst->base);
if (len != 0)
{
dst->base = (char *) malloc(sizeof(char) * len);
if (dst->base == NULL)
{
return E_State_Error;
}
//赋值..
int i = 0;
for (; i < src1.len; i++) dst->base[i] = src1.base[i];
for (i = 0; i < src2.len; i++) dst->base[src1.len+i] = src2.base[i];
dst->len = len;
}
else
{
StringClear(dst);
}
return E_State_Ok;
}
E_State StringSubString(String src,int pos,int len,String * sub){
int stringLen = src.len;
if (pos < 1 || pos > stringLen || len < 0 || len > stringLen - pos + 1)
{
return E_State_Error;
}
free(sub->base);
if (len == 0)
{
StringClear(sub);
}
else
{
sub->base = (char *) malloc(sizeof(char) * len);
if (sub->base == NULL)
{
return E_State_Error;
}
for (int i = 0; i < len; i++) sub->base[i] = src.base[pos-1+i];
sub->len = len;
}
return E_State_Ok;
}
int StringIndex(String s,String sub,int pos){
if (pos >= 1)
{
for (int i = pos; i <= s.len - sub.len + 1; i++)
{
String subStr;
StringInit(&subStr);
StringSubString(s,i,sub.len,&subStr);
if (StringCmp(sub,subStr) == 0)
{
return i;
}
}
}
return 0;
}
E_State StringInsert(String * s,int pos,String insert){
if (pos >= 1)
{
s->base = (char*)realloc(s->base,sizeof(char)* (s->len + insert.len));
if (s->base == NULL)
{
return E_State_Error;
}
for (int i = s->len - 1; i >= pos -1; i--)//后退
{
s->base[i+insert.len] = s->base[i];
}
for (int i = 0; i < insert.len; i++)//拷贝
{
s->base[pos-1+i] = insert.base[i];
}
s->len += insert.len;
}
return E_State_Ok;
}
E_State StringDelete(String * s,int pos,int len){
if (pos < 1 || pos > s->len || pos+len-1 > s->len)
{
return E_State_Error;
}
for (int i = pos+len-1; i < s->len; i++)
{
s->base[i-len] = s->base[i];
}
s->len -= len;
return E_State_Ok;
}
E_State StringReplace(String * s,String find,String replace){
if (find.len > 0)
{
for (int i = 1; i <= s->len - find.len + 1;)
{
int index = StringIndex(*s,find,i);
if (index == 0)
{
break;
}
else
{
i = index + find.len;
}
StringDelete(s,index,find.len);
StringInsert(s,index,replace);
}
}
return E_State_Ok;
}
void StringTraverse(String s){
printf("-------遍历开始-------------\n");
for (int i = 0; i < s.len; i++)
{
printf("%c",s.base[i]);
}
printf("\n-------遍历结束-------------\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
String test1,test2;
StringInit(&test1);
StringInit(&test2);
StringAssign(&test1,"Hello,World!");
StringTraverse(test1);
StringCopy(&test2,test1);
StringConcat(&test2,test1,test1);
StringInsert(&test2,2,test1);
StringTraverse(test2);
StringDelete(&test2,3,test1.len);
StringTraverse(test2);
printf("index : %d\n",StringIndex(test2,test1,1));
String test3;
StringInit(&test3);
StringAssign(&test3,"test");
StringReplace(&test2,test1,test3);
StringTraverse(test2);
//最后释放内存
StringDestory(&test2);
StringDestory(&test1);
return 0;
}