#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#define MAXN 50
#define OK 1
#define ERROR 0
typedef struct strnode
{
char str[MAXN+1];
int len;
}Snode;
void creat(Snode *,char *);///创建串
int getSubStr(Snode *,int ,int ,Snode *);///求子串
int delSubStr(Snode *,int ,int );///删除子串
int insSubStr(Snode *,Snode *,int );///插入子串
int repStr(Snode *,Snode *,int );///置换子串
void clear();///清屏
int main()
{
int choose;
char temp[MAXN];
int start,len,pos;
Snode str,sub_str;
do
{
printf("\t\t\t*****************\n");
printf("\t\t\t*1.求子串\t*\n");
printf("\t\t\t*2.删除子串\t*\n");
printf("\t\t\t*3.插入字串\t*\n");
printf("\t\t\t*4.串置换\t*\n");
printf("\t\t\t*0.退出\t\t*\n");
printf("\t\t\t*****************\n");
printf("\t\t\t请输入你需要操作的菜单:");
scanf("%d",&choose);
if(choose==0)
{
printf("\t\t\t欢迎下次再使用!\n");
break;
}
switch(choose)
{
case 1:
printf("请输入你需要创建的串:");
scanf("%s",temp);///输入主串
creat(&str,temp);///把主串赋值到主串结构体
printf("主串如下:");
puts(str.str);///输出主串,提示用户刚才的输入
printf("请输入要截取的首位置和长度:");
scanf("%d%d",&start,&len);
if(getSubStr(&str,start,len,&sub_str))///操作后对返回值进行判断
{
///操作成功
printf("截取模式串为:");
puts(sub_str.str);
}
else
puts("ERROR");///操作失败,提示用户
break;
case 2:
printf("请输入你需要创建的串:");
scanf("%s",temp);///输入主串
creat(&str,temp);///把主串赋值到主串的结构体
printf("主串如下:");
puts(str.str);///输入主串的结构体
printf("请输入要删除的首位置和长度:");
scanf("%d%d",&start,&len);
if(delSubStr(&str,start,len))///根据操作完的返回值进行判断
{
printf("删除之后的主串:");
puts(str.str);
}
else
puts("ERROR");///提示用户操作错误
break;
case 3:
printf("请输入你需要创建的第一个串:");
scanf("%s",temp);///输入主串
creat(&str,temp);///把主串赋值到主串的结构体
printf("请输入你需要创建的第二个串:");
scanf("%s",temp);///输入子串
creat(&sub_str,temp);///把子串赋值到子串的结构体
printf("请输入你要在插入第一个串的位置:");
scanf("%d",&pos);
if(insSubStr(&str,&sub_str,pos))
{
printf("插入之后的第一个主串:");
puts(str.str);
}
else
puts("ERROR");
break;
case 4:
printf("请输入你需要创建的第一个串:");
scanf("%s",temp);
creat(&str,temp);
printf("请输入你需要创建的第二个串:");
scanf("%s",temp);
creat(&sub_str,temp);
printf("请输入你要在插入第一个串的位置:");
scanf("%d",&pos);
if(repStr(&str,&sub_str,pos))
{
printf("交换之后的第一个主串:");
puts(str.str);
}
else
puts("ERROR");///操作失败提示用户
break;
default :printf("输入错误,请重新输入\n");break;
}
clear();
}while(1);
return 0;
}
///创建串
void creat(Snode *S,char *temp)///创建子串,主要是用把之前输入的串赋值到结构体里,并把长度记录下来
{
int i;
for(i=0;*(temp+i);i++)///遇到换行是空的,循环就结束了
*(S->str+i)=*(temp+i);///赋值操作
*(S->str+i)='\0';///赋值完,在结构体的下一个位置赋值换行,代表这个串的结束
S->len=i;///i就是长度
}
///求子串
int getSubStr(Snode *S,int start,int len,Snode *sub_str)
{
int i;
if(len<=0||start>=S->len||start<0||len>S->len-start)///子串长度为0或开始位置大于主串的长度或开始位置小于0,这些都是错误的
///开始的位置到结束的位置大于主串的余下长度也是错误的
return ERROR;///操作失败返回ERROR
for(i=0;i<len;i++) ///如果len是小于主串start余后的长度就直接赋值它所要求的长度就够,主串肯定是够赋值给它的
*(sub_str->str+i)=*(S->str+i+start);///赋值操作
*(sub_str->str+i)='\0';///赋值完进行换行
return OK;///操作成功返回OK
}
///删除子串
int delSubStr(Snode *S,int start,int len)
{
int i,j;
if(start<0||len<=0||len>S->len-start||start>=S->len)///删除的开始位置小于0或要删除的长度小于等于0或删除长度大于主串从开始位置到结束或者开始位置已经大于等于主串的长度
return ERROR;///操作失败返回ERROR
for(j=start,i=start+len;i<S->len;i++,j++)///删除字串也是直接在删除的后面直接覆盖到前面就好了
*(S->str+j)=*(S->str+i);
*(S->str+j)='\0';///完了进行换行,这个串的删除也就结束了,实现了删除
return OK;///操作成功返回OK
}
///插入子串
int insSubStr(Snode *S,Snode *sub_str,int pos)
{
int i,j,len;///len是插入位置开始到结束的长度
char temp[MAXN];
if(pos>S->len)///如果开始的位置就大于主串的长度,那就根本不能进行插入了
return ERROR;///操作失败返回ERROR
///我的插入思想是:要插入的那个位置开始到结束用一个暂时的字符数组存储,到后面插入完之后,再把这部分赋值过去
for(len=0,i=pos;i<S->len;i++)///插入位置开始到结束先用一个数组存储起来
temp[len++]=*(S->str+i);
for(j=0,i=pos;j<sub_str->len;i++,j++)///把子串插入到主串的操作
*(S->str+i)=*(sub_str->str+j);
for(j=0,i=pos+sub_str->len;j<len;i++,j++)///把刚才存储的数组现在拼接过来
*(S->str+i)=temp[j];
*(S->str+i)='\0';///插入完之后在主串的末尾添加一个换行
return OK;///操作成功返回OK
}
///置换子串
int repStr(Snode *S,Snode *sub_str,int pos)
{
int i,j;
if(pos>S->len)///如果pos的位置已经大于主串的长度那就没法衔接过去了
return ERROR;
for(j=0,i=pos;j<sub_str->len;i++,j++)///替换操作,直接把进行覆盖就行了
*(S->str+i)=*(sub_str->str+j);///pos+子串的长度之后字符一个一个赋值到pos+1,+2.....就实现了替换
return OK;///操作成功返回OK
}
///清屏
void clear()
{
printf("按任意键继续......");
getch();
system("cls");
}
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#define MAXN 50
#define OK 1
#define ERROR 0
typedef struct strnode
{
char str[MAXN+1];
int len;
}Snode;
void creat(Snode *,char *);///创建串
int getSubStr(Snode *,int ,int ,Snode *);///求子串
int delSubStr(Snode *,int ,int );///删除子串
int insSubStr(Snode *,Snode *,int );///插入子串
int repStr(Snode *,Snode *,int );///置换子串
void clear();///清屏
int main()
{
int choose;
char temp[MAXN];
int start,len,pos;
Snode str,sub_str;
do
{
printf("\t\t\t*****************\n");
printf("\t\t\t*1.求子串\t*\n");
printf("\t\t\t*2.删除子串\t*\n");
printf("\t\t\t*3.插入字串\t*\n");
printf("\t\t\t*4.串置换\t*\n");
printf("\t\t\t*0.退出\t\t*\n");
printf("\t\t\t*****************\n");
printf("\t\t\t请输入你需要操作的菜单:");
scanf("%d",&choose);
if(choose==0)
{
printf("\t\t\t欢迎下次再使用!\n");
break;
}
switch(choose)
{
case 1:
printf("请输入你需要创建的串:");
scanf("%s",temp);///输入主串
creat(&str,temp);///把主串赋值到主串结构体
printf("主串如下:");
puts(str.str);///输出主串,提示用户刚才的输入
printf("请输入要截取的首位置和长度:");
scanf("%d%d",&start,&len);
if(getSubStr(&str,start,len,&sub_str))///操作后对返回值进行判断
{
///操作成功
printf("截取模式串为:");
puts(sub_str.str);
}
else
puts("ERROR");///操作失败,提示用户
break;
case 2:
printf("请输入你需要创建的串:");
scanf("%s",temp);///输入主串
creat(&str,temp);///把主串赋值到主串的结构体
printf("主串如下:");
puts(str.str);///输入主串的结构体
printf("请输入要删除的首位置和长度:");
scanf("%d%d",&start,&len);
if(delSubStr(&str,start,len))///根据操作完的返回值进行判断
{
printf("删除之后的主串:");
puts(str.str);
}
else
puts("ERROR");///提示用户操作错误
break;
case 3:
printf("请输入你需要创建的第一个串:");
scanf("%s",temp);///输入主串
creat(&str,temp);///把主串赋值到主串的结构体
printf("请输入你需要创建的第二个串:");
scanf("%s",temp);///输入子串
creat(&sub_str,temp);///把子串赋值到子串的结构体
printf("请输入你要在插入第一个串的位置:");
scanf("%d",&pos);
if(insSubStr(&str,&sub_str,pos))
{
printf("插入之后的第一个主串:");
puts(str.str);
}
else
puts("ERROR");
break;
case 4:
printf("请输入你需要创建的第一个串:");
scanf("%s",temp);
creat(&str,temp);
printf("请输入你需要创建的第二个串:");
scanf("%s",temp);
creat(&sub_str,temp);
printf("请输入你要在插入第一个串的位置:");
scanf("%d",&pos);
if(repStr(&str,&sub_str,pos))
{
printf("交换之后的第一个主串:");
puts(str.str);
}
else
puts("ERROR");///操作失败提示用户
break;
default :printf("输入错误,请重新输入\n");break;
}
clear();
}while(1);
return 0;
}
///创建串
void creat(Snode *S,char *temp)///创建子串,主要是用把之前输入的串赋值到结构体里,并把长度记录下来
{
int i;
for(i=0;*(temp+i);i++)///遇到换行是空的,循环就结束了
*(S->str+i)=*(temp+i);///赋值操作
*(S->str+i)='\0';///赋值完,在结构体的下一个位置赋值换行,代表这个串的结束
S->len=i;///i就是长度
}
///求子串
int getSubStr(Snode *S,int start,int len,Snode *sub_str)
{
int i;
if(len<=0||start>=S->len||start<0||len>S->len-start)///子串长度为0或开始位置大于主串的长度或开始位置小于0,这些都是错误的
///开始的位置到结束的位置大于主串的余下长度也是错误的
return ERROR;///操作失败返回ERROR
for(i=0;i<len;i++) ///如果len是小于主串start余后的长度就直接赋值它所要求的长度就够,主串肯定是够赋值给它的
*(sub_str->str+i)=*(S->str+i+start);///赋值操作
*(sub_str->str+i)='\0';///赋值完进行换行
return OK;///操作成功返回OK
}
///删除子串
int delSubStr(Snode *S,int start,int len)
{
int i,j;
if(start<0||len<=0||len>S->len-start||start>=S->len)///删除的开始位置小于0或要删除的长度小于等于0或删除长度大于主串从开始位置到结束或者开始位置已经大于等于主串的长度
return ERROR;///操作失败返回ERROR
for(j=start,i=start+len;i<S->len;i++,j++)///删除字串也是直接在删除的后面直接覆盖到前面就好了
*(S->str+j)=*(S->str+i);
*(S->str+j)='\0';///完了进行换行,这个串的删除也就结束了,实现了删除
return OK;///操作成功返回OK
}
///插入子串
int insSubStr(Snode *S,Snode *sub_str,int pos)
{
int i,j,len;///len是插入位置开始到结束的长度
char temp[MAXN];
if(pos>S->len)///如果开始的位置就大于主串的长度,那就根本不能进行插入了
return ERROR;///操作失败返回ERROR
///我的插入思想是:要插入的那个位置开始到结束用一个暂时的字符数组存储,到后面插入完之后,再把这部分赋值过去
for(len=0,i=pos;i<S->len;i++)///插入位置开始到结束先用一个数组存储起来
temp[len++]=*(S->str+i);
for(j=0,i=pos;j<sub_str->len;i++,j++)///把子串插入到主串的操作
*(S->str+i)=*(sub_str->str+j);
for(j=0,i=pos+sub_str->len;j<len;i++,j++)///把刚才存储的数组现在拼接过来
*(S->str+i)=temp[j];
*(S->str+i)='\0';///插入完之后在主串的末尾添加一个换行
return OK;///操作成功返回OK
}
///置换子串
int repStr(Snode *S,Snode *sub_str,int pos)
{
int i,j;
if(pos>S->len)///如果pos的位置已经大于主串的长度那就没法衔接过去了
return ERROR;
for(j=0,i=pos;j<sub_str->len;i++,j++)///替换操作,直接把进行覆盖就行了
*(S->str+i)=*(sub_str->str+j);///pos+子串的长度之后字符一个一个赋值到pos+1,+2.....就实现了替换
return OK;///操作成功返回OK
}
///清屏
void clear()
{
printf("按任意键继续......");
getch();
system("cls");
}