学过《C语言程序设计》的都应该知道字符串的定义和相关操作。串跟字符串基本一样,只不过分为顺序存储结构和链式存储结构。这里只讲顺序存储结构,即顺序串。
串的相关定义
虽然都知道,但还是要提一下,哈哈
串:字符串的简称,是由零个或多个字符组成的有限序列。零个字符的串叫做空串。
子串:一个串中任意个连续的字符组成的序列,叫做该串的子串。空串是任何串的子串!
串长:串中所含字符个数。
串与串的关系:
串s = 串str:当且仅当两个串的长度相等并且各个对应位置上的字符都相同;
串s > 串str:设s[n],str[n]是串s,str第一对对应位置上不相等的字符,若s[n]>str[n],则a>b;
串s < 串str:设s[n],str[n]是串s,str第一对对应位置上不相等的字符,若s[n]<str[n],则s<str;
串类型定义
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
typedef struct lei
{
char data[MaxSize]; //存放串字符
int length; //存放串长
}lei; //串的类型
基本操作
void StrAssign(lei &s,char str[]); //生成串 //初始化
void Dwatorystr(lei &s); //销毁串
void strcpy(lei &s_str,lei s); //复制串 //c语言字符串复制函数strcpy包含在头文件#include<string.h>内;
int strcmp(lei s,lei s_str); //比较函数 //c语言字符串比较函数strcpy包含在头文件#include<string.h>内;
int strlen(lei s); //求串长度 //c语言字符串求长度函数strlen包含在头文件#include<string.h>内
lei strcat(lei s,lei s_str); //串链接函数 //c语言字符串连接函数strcat包含在头文件#include<string.h>内
lei substr(lei s,int i,int j); //求子串 // 从第 i 个元素开始之后的 j 个元素
lei InsStr(lei s,int i,lei s_str); //子串的插入 //把串s_str插入到 s 的第 i 个元素的位置
lei Delstr(lei s,int i,int j); //子串的删除 //把串中第 i 个字符开始的长度为 j 的子串删除
lei repstr(lei s,int i,int j,lei s_str);//子串的替换 //把串中第i个元素开始的长度为 j 的子串替换成 s_str
void print(lei s); //输出串
基本操作的函数实现
void StrAssign(lei &s,char str[]) //生成串 //初始化
{
int i;
for(i=0;str[i]!='\0';i++)
{
s.data[i]=str[i];
}
s.length=i;//设置串的长度
}
void Dwatorystr(lei &s) //销毁串
{}
void strcpy(lei &s_str,lei s) //复制串 //把串s中的字符复制到空串s_str中
{
for(int i=0;i<s.length;i++)
{
s_str.data[i]=s.data[i];
}
s_str.length=i;//设置串的长度
}
int strcmp(lei s,lei s_str) //比较函数 //返回值:s大于s_str:1;等于:0;小于:-1;
{
int m=0;
for(int i=0;i<=s.length;i++)
{
if(s.data[i]>s_str.data[i])//s>s_str
{
m=1;
break;
}
if(s.data[i]<s_str.data[i])//s<s_str
{
m=-1;
break;
}
}
return m;
}
int strlen(lei s) //求串长度 //返回串长
{
return(s.length);
}
lei strcat(lei s,lei s_str) //串连接函数 //将s和s_str链接成一个串
{
lei ss;
for(int i=0;i<s.length;i++)
{
ss.data[i]=s.data[i];
}
for(int j=0;j<s_str.length;j++,i++)
{
ss.data[i]=s_str.data[j];
}
ss.length=i;
return ss;
}
lei substr(lei s,int i,int j) //求子串
{
lei ss;
ss.length=0;//设置ss串为空
if(i<0||i>s.length||j<0||i+j-1>s.length)//参数不正确时返回空串
return ss;
for(int k=i-1;k<i+j-1;k++)
{
ss.data[k-i+1]=s.data[k];
}
ss.length=j;//设置串长度
return ss;
}
lei InsStr(lei s,int i,lei s_str) //子串的插入
{
lei ss;
ss.length=0;
if(i<0||i>s.length)//参数不正确则返回空串
return ss;
for(int j=0;j<i-1;j++)
{
ss.data[j]=s.data[j];
}
for(j=0;j<s_str.length;j++)
{
ss.data[i+j-1]=s_str.data[j];
}
for(j=i-1;j<s.length;j++)
{
ss.data[s_str.length+j]=s.data[j];
}
ss.length=s.length+s_str.length;
return ss;
}
lei Delstr(lei s,int i,int j) //子串的删除
{
lei ss;
ss.length=0;
if(i<=0||i>s.length||i+j-1>s.length)
return ss;
for(int k=0;k<i-1;k++)
{
ss.data[k]=s.data[k];
}
for(k=i+j-1;k<s.length;k++)//因为要小于s.length,所以可j的值可以超限
{
ss.data[k-j]=s.data[k];
}
ss.length=s.length-j;
return ss;
}
lei repstr(lei s,int i,int j,lei s_str)//子串的替换
{
lei ss;
int k;
ss.length=0;
if(i<0||i>s.length||i+j-1>s.length)
return ss;
for(k=0;k<i-1;k++)
{
ss.data[k]=s.data[k];
}
for(k=0;k<s_str.length;k++)
{
ss.data[i-1+k]=s_str.data[k];
}
for(k=i+j-1;k<s.length;k++)
{
ss.data[s_str.length+k-j]=s.data[k];
}
ss.length=s.length+s_str.length-j;
return ss;
}
void print(lei s) //输出串
{
if(s.length>0)
{
for(int i=0;i<s.length;i++)
{
printf("%c",s.data[i]);
}
printf("\n");
}
}
代码示例
int main()
{
lei s,s_str;
char str[]="123456789";
StrAssign(s,str);
printf("初始化串:\n");
print(s);
strcpy(s_str,s);
printf("\n将串s复制给串s_str:\ns_str=");
print(s_str);
printf("\n求串s的长度:\n%d\n",strlen(s));
printf("比较串s、s_str的大小:\n%d\n\n",strcmp(s,s_str));
printf("链接串s、s_str:\n");
print(strcat(s,s_str));
printf("\n求串s第三个字符开始长度为四的子串:\n");
print(substr(s,3,4));
printf("\n将串s_str插入到s的第三个字符的位置:\n");
print(InsStr(s,3,s_str));
printf("\n删除串s第三个字符开始长度为四的子串:\n");
print(Delstr(s,3,4));
printf("\n将s第二个字符开始长度为5的子串替换成s_str:\n\n");
print(repstr(s,2,5,s_str));
Dwatorystr(s);
printf("串已销毁\n");
return 0;
}