串是有零个或者多个字符组成的有限序列。串是 限定了元素为字符的线性表。
串的存储结构
/*串的定长顺序存储结构定义*/
typedef struct
{
//maxSize为已经定义的常量,表示串的最大长度。
//str数组长度定义为maxSize+1,是因为多出一个'\0'作为结束标记
char str[maxSize];
int length;
}Str;
/*串的变长分配存储表示(动态分配存储表示)结构体定义*/
typedef struct
{
char *ch; //指向动态分配存储区首地址的字符指针
int length; //串长度
}Str;
串的变长存储方式在使用时,需要用函数malloc()来分配一个长度为length、类型为char 型的连续存储空间,分配的空间可以用函数free()释放掉。用函数malloc()分配存储空间如果成功,则返回 一个指向起始地址的指针,作为串的基地址,这个地址由ch指针来指向;如果分配失败,则返回NULL。
串的基本操作
/*赋值操作*/
int strassign(Str& str,char* ch)
{
if (str.ch)
free(str.ch); //释放原串空间
int len=0;
char *c=ch;
while(*c) //求ch串的长度
{
++len;
++c;
}
if (len==0) //如果ch为空串,则直接返回空串
{
str.ch=NULL;
str.length=0;
return 1;
}
else
{
str.ch=(char*)malloc(sizeof(char)*(len+1));
//取len+1是为了多分配一个空间给'\0'字符
if(str.ch==NULL) //若分配空间失败则返回0
return 0;
else
{
c=ch;
for (int i=0;i<=len;++i,++c)
/*循环条件中使用<=是为将ch最后的'\0'复制到新串中作为结束标记*/
str.ch[i]=*c;
str.length=len;
return 1;
}
}
}
/*函数strassign()使用时的格式如下*/
strassign(str,"cur input");
/*取串长度*/
int strlength(Str str)
{
return str.length;
}
/*串比较*/
int strcompare(Str s1,Str s2)
{
for (int i=0; i<s1.length && i<s2.length; i++)
if(s1.ch[i]!=s2.ch[i])
return s1.ch[i]-s2.ch[i];
return s1.length-s2.length;
}
/*串连接*/
int concat(Str& str,Str str1,Str str2)
{
if (str.ch)
{
free(str.ch);
str.ch=NULL;
}
str.ch=(char*)malloc(sizeof(char)*(str1.length+str2.length+1))
if (str.ch=NULL)
return 0;
int i=0;
while(i<str1.length)
{
str.ch[i]=str1.ch[i];
++i;
}
int j=0;
while(j<=str2.length)
{
str.ch[i+j]=str2.ch[j];
++j;
}
str.length=str1.length+str2.length;
return 1;
}
/*求子串*/
int substring(Str& substr,Str str,int pos,int len)
{
if(pos<0||pos>=length||length<0||len>str.length-pos)
return 0;
if(substr.ch)
{
free(substr.ch);
substr.ch=NULL;
}
if (len==0)
{
substr.ch=NULL;
substr.length=0;
return 1;
}
else
{
substr.ch=(char*)malloc(sizeof(char)*(len+1));
int i=pos;
int j=0;
while(i<pos+len)
{
substr.ch[j]=str.ch[i];
++i;
++j;
}
substr.ch[j]='\0';
substr.length=len;
return 1;
}
}
/*串清空*/
int clearstring(Str& str)
{
if(str.ch)
{
free(str.ch);
str.ch=NULL;
}
str.length=0;
return 1;
}