C语言实现串子系统
这个串子系统是我借鉴网上一部分人的代码,然后自己添加注释得到的,在原来的八个功能的基础上添加了一个显示字串长度的功能,所以一共九个功能。
功能分别为:
1、输入字串
2、连接字串
3、取出子串
4、删除子串
5、插入子串
6、查找子串
7、比较串大小
8、显示字串
9、显示字串长度
还有一点想说的是,在第二个功能连接字符串中,我使用了strcat()函数,以下是C语言函数中对其的介绍:
strcat:字符串连接函数
函数原型:char *strcat (char *dest,char *src);
头文件:#include<string.h>
是否是标准函数:是
函数功能:将两个字符串连接合并成一个字符串,也就是把字符串 src连接到字符串 dest 后面,连接后的结果放在字符串 dest 中
返回值:指向字符串 dest 的指针
例程如下: 应用 strcat 连接字符串。
#include <string.h>
#include <stdio.h>
int main( )
{
char dest[20]={“ ”};
char *hello = "hello ", *space = " ", *world = "world";
strcat(dest, hello);
strcat(dest, space);
strcat(dest, world);
printf("%s\n", destination);
getch();
return 0;
}
例程说明:
(1)首先,程序声明了一个字符数组和三个字符串变量,将字符数组 dest 初始化位空 串,其余三个字符串变量分别赋予初值。
(2)程序通过调用 strcat 函数实现字符串的连接,首先将字符串 hello 添加到字符数组 dest 的末端,此时字符数组 dest 的值有空串变为"hello",然后继续调用两次 strcat 函数,依 次将字符串 space 和字符串 world 陆续连接到字符数组 dest 的末端,从而完成整个字符串的 连接操作。
(3)最后将最终的结果输出。
本例程最终的运行结果是:
hello world
废话不多说,直接上代码。
#include<stdio.h>
#include<string.h>
#define MAXLEN 100 //串的最大长度
typedef struct
{
char vec[MAXLEN]; //存储串的一维数组
int len; //串的当前长度
}str;
//取出子串
void SubStr(str *r,int i,int j) {
int k;
str a;
str *r1=&a;
if (i+j-1 > r->len) //判断子要取出的串是否超出字串长度
printf ("\n子串超界!\n");
else
{
for ( k=0; k<j; k++) //循环取出子串存入r1
r1->vec[k] = r->vec[i+k-1];
r1->len = j;
r1->vec[r1->len] = '\0';
}
printf("\n取出字符为:");
puts(r1->vec);
}
//删除子串
void DelStr(str *r,int i,int j)
{
int k;
if(i+j-1 > r->len) //判断需要删除的子串是否超界
printf("\n所要删除的子串超界!\n");
else
{
for ( k = i+j; k < r->len; k++,i++) //删除子串,并将剩余子串连接好
r->vec[i] = r->vec[k];
r->len = r->len-j;
r->vec[r->len] = '\0';
printf("\n删除成功!\n");
}
}
//插入字符串
void InsStr(str *r,str *r1,int i)
{
int k;
/*可以插入子串的条件,插入位置不超界且插入子串加原字串长度不得超过MAXLEN*/
/*故插入位置超界或者 插入子串加原字串长度不得超过MAXLEN便不能插入*/
if( i >= r->len || r->len+r1->len > MAXLEN)
printf("\n不能插入!\n");
else
{
for( k = r->len-1; k >= i; k--) //将字串位置i后的元素向后移动子串的长度个单位
r->vec[r1->len+k] = r->vec[k];
for( k=0; k < r1->len; k++) //再将子串插入字串对应位置中
r->vec[i+k] = r1->vec[k];
r->len = r->len+r1->len;
r->vec[r->len] = '\0';
printf("\n插入成功!\n");
}
}
//查找子串
int IndexStr(str *s,str *t)
{
int i,j,k; /* k记录每一趟比较时子串的下标,均从0开始 */
for( i=0; s->vec[i]; i++)
for( j=i,k=0; s->vec[j] == t->vec[k]; j++,k++) //如果不相等,退到外层循环
if(!t->vec[k+1])
return i;
/*t->vec[k+1]为‘/0’表示子串比较完毕,返回匹配成功标志*/
return -1;
/* 主串比较完毕即当s->vec[i]为‘/0’时结束外重循环,返回匹配不成功标志 */
}
//计算字符串长度
int LenStr(str *r)
{
int i=0;
while(r->vec[i] != '\0') //累加计算字符串长度
i++;
return i;
}
//创建字符串
str *CreateStr(str *r)
{
gets(r->vec);
r->len = LenStr(r);
return r;
}
//比较两字串大小
int EqualStr(str *r1,str *r2)
{
int i;
for( i=0; r1->vec[i] && r2->vec[i] && r1->vec[i] == r2->vec[i]; i++);
/*此for循环是为了找到两字串第一次元素不同的位置,并跳出循环*/
return r1->vec[i]-r2->vec[i];
/*然后 通过返回该位置两字串元素的差,就能通过结果的正负来得出两字串的大小比较*/
}
void main()
{
str a,b,c,d;
str *r=&a,*r1=&b;
r->vec[0] = '\0';
int i,j,choice;
while( 1 )
{
printf("\n 串子系统 \n");
printf("\n*********************************************");
printf("\n* 1------输 入 字 串 *");
printf("\n* 2------连 接 字 串 *");
printf("\n* 3------取 出 子 串 *");
printf("\n* 4------删 除 子 串 *");
printf("\n* 5------插 入 子 串 *");
printf("\n* 6------查 找 子 串 *");
printf("\n* 7------比较 串大小 *");
printf("\n* 8------显 示 字 串 *");
printf("\n* 9------显示字串长度 *");
printf("\n* 0------返 回 *");
printf("\n*********************************************");
printf("\n\n请选择菜单号(0--9): ");
scanf("%d",&choice);
getchar();
if(choice == 1)
{
printf("\n请输入一个字符串:");
gets(r->vec);
r->len=LenStr(r);
printf("\n输入成功!\n");
}
else if(choice == 2)
{
printf("\n请输入所要连接的字符串:");
r1=CreateStr(&b);
strcat(r->vec,r1->vec);
r->len=r->len+r1->len;
printf("\n连接成功!\n");
}
else if(choice == 3)
{
printf("\n请输入从第几个字符开始:");
scanf("%d",&i);
getchar();
printf("\n请输入取出的连续字符数:");
scanf("%d",&j);
getchar();
SubStr(r,i,j);
}
else if(choice == 4)
{
printf("\n请输入从第几个字符开始:");
scanf("%d",&i);
getchar();
printf("\n请输入删除的连续字符数:");
scanf("%d",&j);
getchar();
DelStr(r,i-1,j);
}
else if(choice == 5)
{
printf("\n请输入在第几个字符前插入: ");
scanf("%d",&i);
getchar();
printf("\n请输入所要插入的子串: ");
r1=CreateStr(&b);
InsStr(r,r1,i-1);
}
else if(choice == 6)
{
printf("\n请输入所要查找的子串: ");
r1=CreateStr(&b);
i=IndexStr(r,r1);
if(i!=-1)
printf("\n该子串第一次出现的位置是第%d个。\n",i+1);
else
printf("\n该子串不在其中!\n");
}
else if(choice == 7)
{
printf("\n请输入第一个字符串: ");
gets(c.vec);
printf("\n请输入第二个字符串串: ");
gets(d.vec);
if(EqualStr(&c,&d) > 0)
printf("\n第一个串大!\n");
else if(EqualStr(&c,&d) < 0)
printf("\n第二个串大!\n");
else
printf("\n两个串一样大!\n");
}
else if(choice == 8)
{
if(r->vec[0]=='\0')
printf("\n该字符串值为空!\n");
else
{
printf("\n该字符串值为:");
puts(r->vec);
}
}
else if(choice == 9)
printf("字符串长度为:%d",r->len);
else if(choice == 0)
break;
else
printf("\n输入有错误,请重新输入\n");
}
}
程序运行截图
菜单运行界面
可以看到,菜单总共有九个功能,输入数字即可选择对应的功能。
主要功能运行截图
这里一功能1举例,输入1,然后跳出提示语,此时输入要输入的字符串,我这里输入的是:zxcvbn,其他功能暂不举例,有兴趣可以自己试验。
总结
这里的串子系统是使用的顺序存储实现,其存储结构也与严蔚敏老师的数据结构第二版上提到的一致,在实现难度上,只要明确算法,思路清晰,还是很容易实现的。