c语言删除字符串的数据结构,字符串替换C语言数据结构(长度不定)

b75e6a237c4f816c318aafd828283f52.png

3ee669e9f5426e8a8631b497c425b1a6.png

b803f7c2a190164a2cc0f0a59b43e531.png

f6764028e81091bfef6bb16ee3c6ea2a.png

b10880f462710b5fc341f83a04d6aca3.png

我不说这个程序为什么字符串替换还要写这么多代码

总之在输入过程中遇到的 问题我能想到的都解决了

程序的健壮性还是有的 。

knock.gif我个人觉得gainchar函数是这个小程序健壮性的重要体现 末尾还有个英语单词匹配的代码

//查昊昊

# include

# include

# define N 1500 //如果想录入x个字节那么就把N的数值改成x

# define MAX 14000 //当新字符串的个数已经不在 [MIN,MAX]时 此时不再复制字符串

# define MIN 2

int gainint(int *p,int a,int b);//返回数字*p

int gainchar(char *a,int min,int max);//返回字符串长度

int BF(char a[],char b[],int *c);//字符串匹配 BF算法 a为主串,b为被检验的串

void shifang(int *p,char *q);//释放int char指针

int main(){

int domain[2][3]={{MIN,0,0},{N,N,N}},length[5]={0,-1,-1,0,-1},i,j,k,n;//domain为各个字符串范围,length[0-4]分别储存0主字符串长度,1被替换的字符串长度,2替换的字符串长度,3匹配的个数,4新字符串长度

char wen[3][23]={"请输入一段字符串","字符串中要替换的字符串","将要替换的字符替换为"};//显示的界面

char *p[4]={NULL,NULL,NULL,NULL};//p[i]将用于指向各字符串

char spead[2][3]={"原","新"};

int *biao,choice; //biao[]数组储存字符匹配的下标

p[0]=(char *)calloc(N+1,sizeof(char));

do{

for(i=0;i<3;i++) //有三次输入,就是输入wen[][]数组里的问题的选择

{

if(length[i]domain[1][i])//当字符串长度不满足条件时重新输入

{

printf("%s:[字节(%d--%d)]\n",wen[i],domain[0][i],domain[1][i]);//提示输入范围

length[i]=gainchar(p[i],domain[0][i],domain[1][i]);

}

if(!i)//输入原字符串ok时动态申请内存

{

p[1]=(char *)calloc(length[0]+1,sizeof(char));//因为字符数组的最后一位系统总是标识'\0',所以要多申请一个内存

p[2]=(char *)calloc(length[0]+1,sizeof(char));

domain[1][1]=domain[1][2]=length[0];//将后来的字符串输入范围改变

}

if(i==1)

{

if(!length[1]) //如果用户输入的是'\n'则将第一位变为\n长度变为1

{

length[1]=1;

printf("你输入的为回车符:\n");

p[1][0]='\n';

}

biao=(int *)calloc(length[0]/length[1],sizeof(int));//输入旧的字符串完毕时申请biao内存,存储匹配下标

length[3]=BF(p[0],p[1],biao);//p[0]为主串,p[1]为被检验的串,biao[]存匹配的下标,length[3]存匹配的个数

if(!length[3]) //如果没有匹配的就重新输入旧字符串

{

printf("字符串中没有此字符串,请重新输入");

i=0;length[1]=-1; //因为要执行i++,所以i=0

}

}

if(!length[2]) //如果length[2]即替换的字符串长度为0

{

printf("删除要替换的字符串请按0,用回车符代替请按1:\n"); // 如果想删除选中的字符串替换时直接回车有选择

p[2][1-gainint(&length[2],0,1)]='\n';

}

if(i==2&&length[1]==length[2]&&BF(p[1],p[2],biao))//原字符串与旧字符串 相同时重新输入p[2]

{

printf("替换的字符串与被替换的字符串相同,");

length[2]=-1;i=1;

}

}

length[4]=length[0]+(length[2]-length[1])*length[3];//计算新字符串长度

if(length[4]>=MIN&&length[4]<=MAX)

p[3]=(char *)calloc(length[4]+1,sizeof(char));//申请新字符串的内存

system("cls"); //清除屏幕

printf("替换的下标:\n");

for(i=0;i

printf("%-3d%c",biao[i]+1,(i+1)%15?' ':'\n');

printf("\n原字符串:\n%s\n新字符串:\n",p[0]);

for(i=j=n=0;i

if(i==biao[j]) //当i到达匹配的下标

{

printf("%s",p[2]); //输出p[2]

if(length[4]>=MIN&&length[4]<=MAX) //如果新字符串满足长度∈[MIN,MAX] 则复制

for(k=0;k

p[3][n+k]=p[2][k]; //将p[2]存到p[3]里

n+=length[2]-1; //增加长度

i+=length[1]-1; //增加长度

j++; //匹配一个后biao[j]变为biao[j+1]

}

else

{

printf("%c",p[0][i]); //如果没到下标就输出原字符串的字符

if(length[4]>=MIN&&length[4]<=MAX)

p[3][n]=p[0][i]; //将不匹配的复制到p[3]中

}

printf("\n原字符串长度:%-3d新字符串长度:%-3d 替换的个数:%-3d",length[0],length[4],length[3]);

do{

printf("\n0:重新输入字符串并替换\n1:在原字符基础上重新替换\n2:对替换后的字符串执行新一轮替换\n3:释放指针+安全退出 输入你的选择(0--3):\n");

if(!gainint(&choice,0,3))

{

length[0]=0; //重新开始要让length[0]改为0

domain[1][0]=N;

}

else if(choice==2)

{ //当用户选择新字符串时让p[0]指向新字符串

p[0]=length[4]

if(length[4]MAX)

printf("新字符串字节已经不在[%d,%d]范围内!\n",MIN,MAX);

else

{

shifang(NULL,p[0]); //就释放p[0]

length[0]=length[4];//将length[0]改为新字符串的长度

domain[1][0]=length[0]>N?length[0]:N;//如果新的字符串高于250则将范围改为新字符串的长度

}

}

}while((length[4]>MAX||length[4]

printf("%s",choice==1||choice==2?spead[choice-1]:"\0"); //输出"新"或"旧"

length[1]=length[2]=-1; //将其初始化

shifang(biao,p[2]); //释放申请的内存

shifang(NULL,p[1]); //释放申请的内存

shifang(NULL,choice<2?p[3]:NULL); //如果用户输入的选择是前两个,则p[3]就没用了,也要释放

}while(choice<3);

shifang(NULL,p[0]);

return 0;

}

int gainint(int *p,int a,int b)//输入int *p直至满足[a,b]输入结束,返回*p

{

do{

*p=a-1;

scanf("%d",p);

while(getchar()!='\n');

if(*p>b||*p

printf("输入有误,请重新输入(%d--%d):\n",a,b);

}while(*p>b||*p

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值