【C语言题】输入两个字符串s1,s2,把s1中的s2换成#

0、有意义的字符串处理题

在这里插入图片描述

1、为了做这题

我花了好几个小时,一大部分在查C语言库提供了哪些可以解决这个问题的函数,刚刚开始使用的是<string.h>中的strstr(s,s1):返回NULL或者s1在s中首次出现的地址,注意这是一个地址(char*),然后一串乱搞,没搞成。

后来翻来这本书,仔细研究了strcmp(s1,s2)和
strcpy(s1,s2),strncpy(s1,s2,n)这三个函数以后,让我天灵盖一通。
在这里插入图片描述

2、写下了这段代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
	char s1[1000];
	char s2[1000];
	printf("请输入长字符串s1:\n");
	gets(s1);//输入字符串s1
	printf("请输入短字符串s2:\n");
	gets(s2);//输入字符串s2
	int s1L = strlen(s1);//存字符串s1的长度
	int s2L = strlen(s2);//存字符串s2的长度
	
	printf("字符串长度s1L=【%d】,s2L=【%d】\n",s1L,s2L);
	
	char*spp=(char *)malloc(s2L);//存放复制的字符串
	char*s2p=s2;//指向s2的字符指针
	int i;
	int bool=1;
	for(i = 0;i<s1L-s2L+1;i++){//遍历s1长度-s2-1长度
		bool=1;
		if(s1[i]==s2[0]){//判断首字母是否有匹配关系
			
			//***/下面这两句是测试使用代码,使用时可注释掉!
			//printf("匹配的首项是第:%d项\n",i);
			//printf("此时s2[0]的值为:%c\n",s2[0]);
			
			/*此处可能是最难理解的,我也是画图才写出来的
			  作用就是如果s2的首个字符与s1的某个匹配,
			  就有可能后面也匹配,这时,我们需要检查
			  后面的字符是否也匹配。
			*/
			//比较:s2+1字符串和s[i+1]开始的后边(s2L-1)个字符
			bool=strcmp(s2p+1,strncpy(spp,&s1[i+1],s2L-1));
			
			//***下面这句是测试使用代码,使用时可注释掉!
			//printf("比较结果bool=%d\n",bool);//测试使用代码
			if(bool==0){//相等返回0,说明有匹配项,
				//***下面这句是测试使用代码,使用时可注释掉!
				//printf("存在字符串匹配的情况!\n");
				s1[i]='#';//断点处设为#
				for(int k=1;k<s1L-i-1;k++){//下一步,就是断点以后的元素全都前移啦
					s1[i+k]=s1[(i+k)+s2L-1];
				}
				i-=s2L-1;//别忘了i也要前移
			}
		}else{
			//下面这两句是测试使用代码,使用时可注释掉!
			//printf("\n");
			//printf("不匹配的项是:i=【%d】\n",i);
		}
	}
	printf("处理后的数组长度:%d\n",strlen(s1));
	puts(s1);//显示处理后的字符串
	free(spp);//malloc申请的内存空间别忘了free掉
	return 0;
}

3、完。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值