串基本操作的编程实现
串基本操作的编程实现,掌握串的建立、遍历、插入、删除等基本操作的编程实现,也可以进一步编程实现查找、合并、剪裁等操作,存储结构可以在顺序结构或链接结构、索引结构中任选,也可以全部实现。也鼓励学生利用基本操作进行一些应用的程序设计。
函数名:setstr()
描述:建立一个顺序串
入口参数:无
出口参数:无
说明:对于顺序串的建立,我定义了个全局变量数组str[100],字符串长度strlength,之前我尝试了使用快捷键的方式结束字符串的输入,但是觉得这种方法有弊端,如果我的字符串中想出现快捷键字符的话并不能实现。所以我直接使用了gets()函数,直接得到一个字符串,存入数组之中,有一点好处就是gets()函数遇到回车就会结束字符串的输入。然后我通过循环读取了字符串的长度存在了strlength中。重要代码如下:
void setstr()
{
str[100]=NULL;
strlength=0;
fflush(stdin);
printf("请输入要创建的字符串(100以内,回车结束):");
gets(str);
puts("创建成功!");
for(int i=0;str[i]!='\0';i++) //统计字符串个数
{
strlength++;
}
}
函数名:showstr()
描述:显示一个顺序串
入口参数:无
出口参数:无
说明:显示字符串其实就是输出每一个字符,我看了老师的程序之后,对于他的显示界面还是很喜欢的,所以我也采用了这种显示方式(如图)
有一点不同的是,我的显示序号是从1-0,老师的是0-9,每超过十个就会显示数量,所以我个人认为我这样显示的话很好去知道哪一个字符在哪一个地方,例如‘m’在13位,很容易找到。对于显示方法,我直接使用循环输入了每一个字符。重要代码如下:
for(j=0;str[j]!='\0';j++)
printf("%c",str[j]);
函数名:modstr()
描述:修改一个顺序串中任何一个字符,其中包括字符的长短。
入口参数:无
出口参数:无
说明:对于顺序串的修改,首先我们必须先确定用户需要修改的位置,然后修改他所需要修改的地方,其中修改有以下三种情况:
因为新字符串比需要修改的字符串短,所以我们既可以先移动后面的字符串再覆盖也可以先覆盖再移动,这里我采用的是先覆盖再前移,先计算出新字符串的长度,然后计算出需要前移的数量为(last-first+1)-length,通过覆盖原先的字符串,再讲后面的字符串前移就达到了效果。重要代码如下:
for(int i=0;modstr[i]!='\0';i++) //统计字符串个数
length++;
if(length<last-first+1) //新字符串长度小于修改字符串
{
for(i=first-1,j=0;modstr[j]!='\0';i++,j++) //数据覆盖
{
str[i]=modstr[j];
}
for(j=last;j!=strlength+1;j++) //数据前移
{
str[j-(last-first+1)+length]=str[j];
}
strlength-=(last-first+1)-length; //整个字符串的新长度
}
这种情况相对于简单,就是普通的一个覆盖,不需要任何的移动。重要代码如下:
else if(length==last-first+1) //新字符串长度等于修改字符串
{
for(int i=0;first!=last+1;first++,i++)
{
str[first-1]=modstr[i];
}
}
对于这种情况我们先将需要修改字符串后面的字符串移动,然后再讲新的字符串插入覆盖。计算出需要移动的数量length-(last-first+1),将新的字符串覆盖。重要代码如下:
else if(length>last-first+1) //新字符串长度大于修改字符串
{
for(i=strlength;i>last-1;i--) //原数组后移
{
str[i+length-(last-first+1)]=str[i];
}
for(i=first-1,j=0;modstr[j]!='\0';i++,j++) //插入覆盖
{
str[i]=modstr[j];
}
strlength+=length-(last-first+1);
}
函数名:insertstr()
描述:在任何地方插入一个任意长度的字符串。
入口参数:无
出口参数:无
说明:对于字符串的插入,无非就是先移动数据再将新的字符串插入覆盖。先计算出新字符串的长度,再将插入位置后面的字符串向后移动这个长度,再将新的字符串覆盖。重要代码如下:
printf("请输入要插入的位置:");
scanf("%d",&last);
printf("请输入要插入的字符串:");
fflush(stdin);
gets(insertstr);
for(i=0;insertstr[i]!='\0';i++) //统计插入字符个数
length++;
for(i=strlength-1;i!=last-2;i--) //原数组后移
{
str[i+length]=str[i];
}
for(i=last-1,j=0;insertstr[j]!='\0';i++,j++) //插入覆盖
{
str[i]=insertstr[j];
}
printf("插入成功!\n");
strlength+=length;
}
函数名:delstr()
描述:在任何地方删除一个任意长度的字符串。
入口参数:无
出口参数:无
说明:删除字符串就是将需要删除字符串后面的字符串前移。首先
计算出新字符串的长度,然后前移。重要代码如下:
printf("请输入要删除的初始位置:");
scanf("%d",&first);
printf("请输入要删除的终止位置:");
scanf("%d",&last);
for(i=first-1,j=last;i!=last;i++,j++) //前移覆盖
{
str[i]=str[j];
}
strlength-=last-first+1;
}
函数名:searchstr()
描述:在字符串中查找一段连续的字符串。
入口参数:无
出口参数:无
说明:首先输入需要查找的字符串,通过一个三重循环就可以查找。第一层循环判断总字符串查找是否结束,第二重循环判断查找字符串,第三重循环判断需要查找的字符串是否结束。重要代码如下:
printf("请输入需要查找的字符串:");
gets(searchstr);
for(i=0;searchstr[i]!='\0';i++) //统计插入字符个数
length++;
while(str[position]!='\0') //判断主串是否结束
{
for(i=position,j=0;searchstr[j]==str[i];i++,j++) //比较
{
if(searchstr[j+1]=='\0') //判断查找串是否结束
{
flag=1;
break;
}
}
position++; //下一个字符
if(flag==1)
break;
}
if(flag==1)
{
printf("查找成功!\n");
}
#include
#include
#include
void showmenu();//菜单显示
void processmenu();//菜单控制
void setstr();//建立顺序串
void showstr();//显示顺序串
void modstr();//修改顺序串
void insertstr();//插入顺序串
void delstr();//删除顺序串
void searchstr();//查找顺序串
void strlong();//求串长
char str[100];
char strlength=0;
int main()
{
system("color f0");//背景白色
while(1)
{
showmenu();
processmenu();
system("pause");
system("cls");
}
}
void showmenu()
{
puts("~~~~~~~~~~~~~~~~~~~~~~~~");
puts("\t\t串基本操作的编程实现");
puts("\t\t操作软件:dev c++");
puts(" ~~~~~~~~~~~~~~~~~~~~~~~~");
puts("~~~\t\t1、建立顺序串\t\t~~~~");
puts(" ~~~\t\t2、显示\t\t\t ~~~~");
puts("~~~\t\t3、修改\t\t\t~~~~");
puts(" ~~~\t\t4、插入\t\t\t ~~~~");
puts("~~~\t\t5、删除\t\t\t~~~~");
puts(" ~~~\t\t6、查找\t\t\t ~~~~");
puts(" ~~~\t\t7、求串长度\t\t ~~~~");
puts("~~~\t\t0、退出程序\t\t~~~~");
puts("~~~~~~~~~~~~~~~~~~~~~~~~");
puts("");
printf("请输入您的选择:");
}
void processmenu()
{
int menuchoice;//菜单选择
scanf("%d",&menuchoice);
switch(menuchoice)
{
case 1:
setstr();
fflush(stdin);
break;
case 2:
showstr();
fflush(stdin);
break;
case 3:
modstr();
fflush(stdin);
break;
case 4:
insertstr();
break;
case 5:
delstr();
fflush(stdin);
break;
case 6:
searchstr();
fflush(stdin);
break;
case 7:
strlong();
fflush(stdin);
break;
case 0:
puts("\n~~~~~~~~~~~~~~~~~~~~~~~~");
puts("\t\t欢迎下次再用!");
puts("~~~~~~~~~~~~~~~~~~~~~~~~\n");
exit(0);
default :
printf("输入错误!请重新输入...\n");
}
}
void setstr()
{
str[100]=NULL;
strlength=0;
fflush(stdin);
printf("请输入要创建的字符串(100以内,回车结束):");
gets(str);
puts("创建成功!");
for(int i=0;str[i]!='\0';i++) //统计字符串个数
{
strlength++;
}
}
void showstr()
{
if(strlength==0)
printf("顺序串为空!\n");
else
{
int j=0;
printf("位置:");
for(int i=strlength/10;i!=-1;i--)
{
printf("|---%d----|",j);
j++;
}
printf("\n位置:");
for(int i=strlength/10;i!=-1;i--)
{
printf("1234567890");
}
printf("\n当前:");
for(j=0;str[j]!='\0';j++)
printf("%c",str[j]);
printf("\n");
}
}
void modstr()
{
if(strlength==0)
printf("顺序串为空!\n");
else
{
int first,last;
int length=0;
int i,j;
char modstr[100];
showstr();
printf("请输入要修改的初始位置:");
scanf("%d",&first);
printf("请输入要修改的终止位置:");
scanf("%d",&last);
printf("请输入新的字符串:");
fflush(stdin);
gets(modstr);
for(int i=0;modstr[i]!='\0';i++) //统计字符串个数
length++;
if(length<last-first+1) //新字符串长度小于修改字符串
{
for(i=first-1,j=0;modstr[j]!='\0';i++,j++) //数据覆盖
{
str[i]=modstr[j];
}
for(j=last;j!=strlength+1;j++) //数据前移
{
str[j-(last-first+1)+length]=str[j];
}
strlength-=(last-first+1)-length;
}
else if(length==last-first+1) //新字符串长度等于修改字符串
{
for(int i=0;first!=last+1;first++,i++)
{
str[first-1]=modstr[i];
}
printf("修改成功!\n");
}
else if(length>last-first+1) //新字符串长度大于修改字符串
{
for(i=strlength;i>last-1;i--) //原数组后移
{
str[i+length-(last-first+1)]=str[i];
}
for(i=first-1,j=0;modstr[j]!='\0';i++,j++) //插入覆盖
{
str[i]=modstr[j];
}
printf("修改成功!\n");
strlength+=length-(last-first+1);
}
showstr();
}
}
void insertstr()
{
if(strlength==0)
printf("顺序串为空!\n");
else
{
int last;
int i,j,length;
char insertstr[100];
showstr();
printf("请输入要插入的位置:");
scanf("%d",&last);
printf("请输入要插入的字符串:");
fflush(stdin);
gets(insertstr);
for(i=0;insertstr[i]!='\0';i++) //统计插入字符个数
length++;
for(i=strlength-1;i!=last-2;i--) //原数组后移
{
str[i+length]=str[i];
}
for(i=last-1,j=0;insertstr[j]!='\0';i++,j++) //插入覆盖
{
str[i]=insertstr[j];
}
printf("插入成功!\n");
strlength+=length;
showstr();
}
}
void delstr()
{
if(strlength==0)
printf("顺序串为空!\n");
else
{
showstr();
int i,j;
int first,last;
printf("请输入要删除的初始位置:");
scanf("%d",&first);
printf("请输入要删除的终止位置:");
scanf("%d",&last);
for(i=first-1,j=last;i!=last;i++,j++) //前移覆盖
{
str[i]=str[j];
}
strlength-=last-first+1;
showstr();
}
}
void searchstr()
{
if(strlength==0)
printf("顺序串为空!\n");
else
{
int i,j;
int position=0;
int flag=0;
int length=0;
char searchstr[100];
fflush(stdin);
printf("请输入需要查找的字符串:");
gets(searchstr);
for(i=0;searchstr[i]!='\0';i++) //统计插入字符个数
length++;
while(str[position]!='\0') //判断主串是否结束
{
for(i=position,j=0;searchstr[j]==str[i];i++,j++) //比较
{
if(searchstr[j+1]=='\0') //判断查找串是否结束
{
flag=1;
break;
}
}
position++; //下一个字符
if(flag==1)
break;
}
if(flag==1)
{
printf("查找成功!\n");
showstr();
printf("查找:");
position--;
while(position--)
printf(" ");
for(i=0;searchstr[i]!='\0';i++ )
printf("%c",searchstr[i]);
printf("\n");
// printf("该字符串的初始位置为:%d\n",position);
// printf("该字符串的末尾位置为:%d\n",length+position-1);
}
else
printf("查找失败!\n");
}
}
void strlong()
{
printf("目前字符串的长度为:%d\n",strlength);
}