首页 > 代码库 > 串最基本的5个操作的C实现

串最基本的5个操作的C实现

1. 串赋值StrAssign

/* 生成一个其值等于chars的串T */雅加达娱乐城Status StrAssign(String T,char *chars){	int i;	if(strlen(chars)>MAXSIZE)		return ERROR;	else	{		T[0]=strlen(chars);		for(i=1;i<=T[0];i++)			T[i]=*(chars+i-1);		return OK;	}}
  •  
    串赋值的算法比较简单,把目标字符串一个个复制到数组T即可。T[i]=*(chars+i-1) 这行代码是关键,字符串可以用指针访问。

2. 串比较StrCompare

/*  初始条件: 串S和T存在 *//*  操作结果: 若S>T,则返回值>0;若S=T,则返回值=0;若S < T,则返回值 < 0 */int StrCompare(String S,String T){	int i;	for(i=1; i<=S[0]&&i<=T[0]; ++i)		if(S[i]!=T[i])			return S[i]-T[i];	return S[0]-T[0];}
  •  
    这里字符串数组的第一个元素存储的是字符串的长度,所以循环条件是 i<=S[0]&&i<=T[0]。假如 S[i]与T[i]不相等,就返回它们的差值,根据这个差值我们就可以知道,哪个字符串比较大。

3. 求串长 StrLength

/* 返回串的元素个数 */int StrLength(String S){	return S[0];}
  •  
    字符串数组的第一个元素存储的就是它的长度,所以直接返回第一个元素就可以了。

4. 串联接Concat

/* 用T返回S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE */Status Concat(String T,String S1,String S2){	int i;	if(S1[0]+S2[0]<=MAXSIZE)	{ /*  未截断 */		for(i=1;i<=S1[0];i++)			T[i]=S1[i];		for(i=1;i<=S2[0];i++)			T[S1[0]+i]=S2[i];		T[0]=S1[0]+S2[0];		return TRUE;	}	else	{ /*  截断S2 */		for(i=1;i<=S1[0];i++)			T[i]=S1[i];		for(i=1;i<=MAXSIZE-S1[0];i++)			T[S1[0]+i]=S2[i];		T[0]=MAXSIZE;		return FALSE;	}}

连接两个串,需要考虑截断问题,判断条件就是 S1[0]+S2[0] 是否大于 MAXSIZE。

如果未发生截断,则将数组S2的元素补到S1的后边 T[S1[0]+i]=S2[i];

如果发生截断,那就将MAXSIZE-S1[0]个S2的元素补到S1的后边。

5. 求子串SubString

/* 用Sub返回串S的第pos个字符起长度为len的子串。 */Status SubString(String Sub,String S,int pos,int len){	int i;	if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1)		return ERROR;	for(i=1;i<=len;i++)		Sub[i]=S[pos+i-1];	Sub[0]=len;	return OK;}
  •  
    这里需要注意条件,起始位置不能小于1,也不能大于串长度,长度len不能小于0,也不能大于总长度减去起始位置等。接下来就简单了,从起始位置开始,将串数组元素逐个赋值给sub数组。

完整的可执行程序为:

#include "stdio.h"#include "string.h"#include "stdlib.h"#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXSIZE 40 /* 存储空间初始分配量 */typedef int Status;		/* Status是函数的类型,其值是函数结果状态代码,如OK等 */typedef char String[MAXSIZE+1]; /*  0号单元存放串的长度 *//*  输出字符串T */void StrPrint(String T){	int i;	for(i=1;i<=T[0];i++)		printf("%c",T[i]);	printf("\n");}/* 生成一个其值等于chars的串T */Status StrAssign(String T,char *chars){	int i;	if(strlen(chars)>MAXSIZE)		return ERROR;	else	{		T[0]=strlen(chars);		for(i=1;i<=T[0];i++)			T[i]=*(chars+i-1);		return OK;	}}/* 返回串的元素个数 */int StrLength(String S){	return S[0];}/*  初始条件: 串S和T存在 *//*  操作结果: 若S>T,则返回值>0;若S=T,则返回值=0;若S < T,则返回值< 0 */int StrCompare(String S,String T){	int i;	for(i=1;i < =S[0]&&i<=T[0];++i)		if(S[i]!=T[i])			return S[i]-T[i];	return S[0]-T[0];}/* 用T返回S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE */Status Concat(String T,String S1,String S2){	int i;	if(S1[0]+S2[0]<=MAXSIZE)	{ /*  未截断 */		for(i=1;i<=S1[0];i++)			T[i]=S1[i];		for(i=1;i<=S2[0];i++)			T[S1[0]+i]=S2[i];		T[0]=S1[0]+S2[0];		return TRUE;	}	else	{ /*  截断S2 */		for(i=1;i<=S1[0];i++)			T[i]=S1[i];		for(i=1;i<=MAXSIZE-S1[0];i++)			T[S1[0]+i]=S2[i];		T[0]=MAXSIZE;		return FALSE;	}}/* 用Sub返回串S的第pos个字符起长度为len的子串。 */Status SubString(String Sub,String S,int pos,int len){	int i;	if(pos < 1||pos>S[0]||len < 0||len>S[0]-pos+1)		return ERROR;	for(i=1;i<=len;i++)		Sub[i]=S[pos+i-1];	Sub[0]=len;	return OK;}int main(){    int i, j, opp;    char s;	String t,s1,s2,sub;	Status k;    printf("\n1.StrAssign 生成串 \n2.StrLength 求串长 \n3.StrCompare 串比较 ");    printf("\n4.Concat 串连接 \n5.SubString 求子串");    printf("\n0.退出 \n请选择你的操作:\n");    while(opp != ‘0‘)    {        scanf("%d",&opp);        switch(opp)        {        case 1:            k=StrAssign(s1,"nowamagic.net");            if(!k)            {                printf("串长超过MAXSIZE(=%d)\n",MAXSIZE);                exit(0);            }            printf("串s1为:");            StrPrint(s1);            printf("\n");            break;        case 2:            printf("串s1长为%d \n",StrLength(s1));            break;        case 3:            k=StrAssign(s2,"google.com");            if(!k)            {                printf("串长超过MAXSIZE(%d)\n",MAXSIZE);                exit(0);            }            printf("串s2为:");            StrPrint(s2);            printf("\n");            i=StrCompare(s1,s2);            if(i < 0)                s=‘ < ‘;            else if(i==0)                s=‘=‘;            else                s=‘>‘;            printf("串s1%c串s2\n",s);            break;        case 4:            Concat(t,s1,s2);            StrPrint(t);            break;        case 5:            printf("求串s1的子串,请输入子串的起始位置: ");            scanf("%d", &i);            printf("请输入子串的长度: ");            scanf("%d", &j);            printf("起始位置:%d,子串长度:%d\n", i, j);            k=SubString(sub,s1,i,j);            if(k)            {                printf("子串sub为: ");                StrPrint(sub);            }            break;        case 0:            exit(0);        }    }}

串最基本的5个操作的C实现