#pragma once
#define _STRING_H_
#include<stdlib.h>
#include<iostream>
using namespace std;
#define Maxsize 255
typedef struct
{
char *ch;
}sstring;
void InitString(sstring *s)
{
s->ch = (char *)malloc(sizeof(char)*(Maxsize+1));
s->ch[0] = Maxsize;
}
//给字符串赋值
void StrAssign(sstring *s, char *ch)
{
unsigned int i = 1;
unsigned int j = 0;
while (i <= s->ch[0] && ch[j]!= '\0')
{
s->ch[i] = ch[j];
i++;
j++;
}
s->ch[i] = '\0';
}
//将串s清为空串
void ClearStr(sstring *s)
{
s->ch[1] = '\0';
}
//比较两个字符串的大小
int StrCompare(sstring s, sstring t)
{
int i = 1;
while (s.ch[i] != '\0' && t.ch[i]!= '\0')
{
if (s.ch[i] > t.ch[i])
{
return 1;
}
else if (s.ch[i] < t.ch[i])
{
return -1;
}
else
{
i++;
}
}
if (s.ch[i] == '\0' && t.ch[i] == '\0')
{
return 0;
}
if (s.ch[i] == '\0')
{
return -1;
}
if (t.ch[i] == '\0')
{
return 1;
}
}
//拷贝字符串
void StrCopy(sstring *s, sstring t)
{
unsigned int i = 1;
while (i <= s->ch[0] && t.ch[i] != '\0')
{
s->ch[i] = t.ch[i];
i++;
}
s->ch[i] = '\0';
}
//求字符串的长度
int StrLength(sstring s)
{
return s.ch[0];
}
//销毁字符串
void DestoryString(sstring *s)
{
free(s->ch);
}
//字符串的链接
void StrConcat(sstring *t, sstring s1, sstring s2)
{
unsigned int i = 1;
unsigned int j = 1;
while (i <= t->ch[0] && s1.ch[i] != '\0')
{
t->ch[i] = s1.ch[i];
i++;
}
while (i <= t->ch[0] && s2.ch[j] != '\0')
{
t->ch[i] = s2.ch[j];
i++;
j++;
}
t->ch[i] = '\0';
}
//判断字符串是否为空
bool StrEmpty(sstring s)
{
if (s.ch[1] == '\0')
{
return true;
}
return false;
}
//返回s中从pos起长度为len的子串
void SubString(sstring *sub, sstring s,unsigned int pos, int len)
{
int j = 1;
if(pos>=1 && pos<=s.ch[0] && len >=0 && len <=s.ch[0]-pos+1)
{
for(int i = pos;i < pos+len;i++)
{
sub->ch[j] = s.ch[i];
j++;
}
}
sub->ch[j] = '\0';
}
int GetLen(sstring s)
{
int i = 1;
while(s.ch[i] != '\0')
{
i++;
}
return i-1;
}
//查找pos后首次出现子串的位置
int IndexPos(sstring s,sstring t,int pos)
{
int lent = GetLen(t);
int lens = GetLen(s);
int i = pos;
int j = 1;
if(pos >= 1 && pos +lent <= lens)
{
j = 1;
for(i;i+lent <= lens;i++)
{
for(j;j <= lent;j++)
{
if(t.ch[j] == s.ch[i])
{
i++;
}
else
{
i=i-j+2;
break;
}
}
if(j > lent)
{
return i-j+1;
}
}
return -1;
}
return -1;
}
//用V替换主串中的t子串
void Replace(sstring *s, sstring t, sstring v)
{
int i = 1;
int lenv = GetLen(v);
int lens = GetLen(*s);
int lent = GetLen(t);
while(i+lent < lens)
{
int pos = IndexPos(*s,t,i);
if(pos > 0)
{
for(int j = 1;j <=lenv;j++ )
{
s->ch[j+pos] = v.ch[j];
}
}
i = pos + lenv;
}
}
//插入子字符串
bool StrInsert(sstring *s, unsigned int pos, char *elem)
{
int lenT = GetLenChar(elem);
int lenS = GetLen(*s);
int j = 0;
unsigned int i = pos;
if(pos <= 0 || pos >lenS )
{
return false;
}
if(pos + lenT > s->ch[0])
{
for(i; i <= s->ch[0];i++)
{
s->ch[i] = elem[j];
j++;
}
s->ch[i] = '\0';
return false;
}
for(j;j <= lenT;j++)
{
s->ch[i] = elem[j];
i++;
}
return true;
}
//删除字符串
bool StrDelete(sstring *s, int pos, int len)
{
int lenS = GetLen(*s);
if(pos < 1 || pos > lenS || pos +len > lenS)
{
return false;
}
int i = pos + len+1;
for(i;i <= lenS;i++)
{
s->ch[i-len] = s->ch[i];
}
s->ch[i-len] = '\0';
return true;
}
//打印字符串
void PrintStr(sstring s)
{
int i = 1;
while(s.ch[i] != '\0')
{
cout<<s.ch[i]<<" ";
i++;
}
cout<<endl;
}
//首尾比较法
int IndexHeadtail(sstring *s, sstring *t)
{
unsigned int i = 1;
unsigned int j = 1;
for (i = 1; i < s->ch[0]; i++)
{
if(i + t->ch[0] - 1 < s->ch[0])
{
if (s->ch[i] == t->ch[j] && s->ch[i + t->ch[0] - 1] == t->ch[t->ch[0] - 1])
{
i++;
for (j = 2; j < t->ch[0] - 1; j++)
{
if (s->ch[i] == t->ch[j])
{
i++;
j++;
}
}
}
if (j == t->ch[0] - 1)
{
return i - j + 1;
}
i = i - j + 2;
}
}
return -1;
}