字符串1——常用函数

零、说明

  1. 字符串就是用数组存储一连串用字符表示的信息
  2. 操作和其他数据结构不同,字符串的每个单位不是其他数据结构的节点,而是字符数组的每位,所以算法理解起来有一点难度。有些函数看起来还挺长的,不过慢慢理解之后会发现其实不难
  3. 由于并非必须,下列函数没有检测输入数据是否正确符合规范没有越界,需要输入自行确定

一、数据类型

typedef char String[MAXSIZE+1];
  1. 使用《大话数据结构》中的做法,String的第0位存储字符串长度,第1到第MAXSIZE位存储数据
  2. String[MAXSIZE-1]等同于*String,即typedef char *String,把char *叫做String

二、输入输出

还没输入之前,字符串为空,无法使用其他函数

  1. 输入:输入字符串S的内容
    逐个读取字符,最后确定字符串长度,赋给S[0]
void Input(String S)
{
	char Tentative;
	int i;
	cout<<"Please enter a string here:";
	Tentative=getchar();
	for(i=1;Tentative!='\n';i++)
	{
		S[i]=Tentative;
		Tentative=getchar();
	}
	S[0]=i-1;		
} 
  1. 输出:打印字符串S
    也是依次输出。不能用cout,因为cout不能输出空格,所以注意要包括stdio.h
void Output(String S)
{
	int i;
	for(i=1;i<=S[0];i++)
	{
		printf("%c",S[i]);
	}
}

三、串间操作

  1. 复制:把字符串S复制到字符串T中
    从第零位依次放入即可
void Copy(String S,String T)
{
	int i;
	for(i=0;i<=S[0];i++)
	{
		T[i]=S[i];
	}
}
  1. 比较:比较字符串S和字符串T,返回S和T的差值(先后顺序)
    按位比较,直到第一个不一样的字符出现;如果到某串结尾都相同,则差值是长度相减
int Compare(String S,String T)
{
	int i;
	for(i=1;i<=S[0]&&i<=T[0];i++)//计数首先逐个比较,其次使得比较在S和T中短的范围内 
	{
		if(S[i]!=T[i])
		{
			return S[i]-T[i];//只要有一个字符不一样,字符串值的差别就在这个字符上了 
		} 
	}
	return S[0]-T[0];//如果前min{S[0],T[0]}个都一样,那值的差别就在字符数上 
}
  1. 连接:把T接在S后面,多了就截断T,只放一部分
void Connect(String S,String T)
{
	int i,j;
	j=(S[0]+T[0]<=MAXSIZE)?T[0]:(MAXSIZE-S[0]);//条件运算符,如果总长小于MAXSIZE,j就是T[0],如果大于,就是MAXSIZE-S[0]
	//j的作用就是标志T中到底能放进去几位
	for(i=1;i<=j;i++)
	{
		S[i+S[0]]=T[i];
	}
	S[0]=(S[0]+T[0]<=50)?(S[0]+T[0]):50;//作用同上,替代if/else
} 
  1. 赋串:将S中第position个字符起length长的子串赋给T
void Getstring(String S,String T,int position,int length)
{
	int i;
	for(i=1;i<=length;i++)
	{
		T[i]=S[position+i-1];
	}
	T[0]=length;
}

四、串内操作

  1. 查找:从S中第position个字符起找是否有sub子串,返回它出现的第一个位置,如果没有,返回0
    有两种思路:
    ①逐位比较
int Index1(String S,String Sub,int position)
{
	int i,j;
	i=position;//用于在主串中搜索 
	j=1;//用于在子串中搜索
	while(i<=S[0]&&j<=Sub[0])//从循环中出来,要么子串没匹配到而主串到头了,要么主串没到头而子串匹配完了即符合想要的 
	{
		if(S[i]==Sub[j])
		{
			i++;
			j++;
		}
		else
		{
			i=i-j+2;//退到这次匹配第一位的下一位,i-(j-1)+1 
		}
	} 
	if(j>Sub[0])
		return i-Sub[0];
	else 
		return 0;
}

②调用Compare

int Index2(String S,String Sub,int position)
{
	int m,n,i;
	String T;
	m=S[0];
	n=Sub[0];
	i=position;
	while(i<=m-n+1)
	{
		Getstring(S,T,i,n);
		if(Compare(Sub,T)!=0)//如果不符合
		{
			i++;
		}
		else
		{
			return i;
		}
	}
	return 0;
} 
  1. 插入:在S中第position个字符前插入Sub
    根据插入后总长可以分为两种情况
void Insert(String S,String T,int position)
{
	int i;
	if(S[0]+T[0]<=MAXSIZE)
	{//完全插入 
		for(i=S[0];i>=position;i--)//后移
		{
			S[i+T[0]]=S[i];
		} 
		for(i=position;i<=position+T[0]-1;i++)//插入
		{
			S[i]=T[i-position+1];//+1的原因是不加一就会从T[0]开始插入 
		} 
		S[0]=S[0]+T[0];//别忘了改 
	}
	else
	{//不完全插入,由于要把T全部插进去,势必会把S的后几位挤出去 
		for(i=MAXSIZE;i>=position+T[0];i--)//部分后移,本来就要挤出去的那几位就不用管了 
		{
			S[i]=S[i-T[0]];
		}
		for(i=position;i<=position+T[0]-1;i++)//从position到position+T[0]-1即插入T的那些位 
		{
			S[i]=T[i-position+1];
		}
		S[0]=MAXSIZE;//别忘了改 
	}
}
  1. 删除:删除S中position位后面length长的子串
    就是简单的前移
void Delete(String S,int position,int length)
{
	int i;
	for(i=position+length;i<=S[0];i++)
	{
		S[i-length]=S[i];
	}
	S[0]=S[0]-length;
}
  1. 替换:将S中的Old串替换成New串
    用Index搜索位置,用Delete删除Old,用Insert插入New
void Replace(String S,String Old,String New)
{
	int i=1;
	do
	{
		i=Index1(S,Old,i);
		if(i)
		{
			Delete(S,i,Old[0]);
			Insert(S,New,i);
			i=i+New[0];
		}
	}while(i);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值