字符串s1为“abababab”,字符串s2为“ba”,字符串s3为“ab”,在s1中找到s2的位置并替换为s3

这应该是今年3G纳新的面试题。
题目是:字符串s1为“abababab”,字符串s2为“ba”,字符串s3为“ab”,在s1中找到s2的位置并替换为s3
下面是代码

#include<stdio.h>
#include<string.h>

int main(void)
{			   
	char S1[10]="abababab";//因为要修改s1,所以要用字符数组,而非字符串常量
	char last[10]="";//这里用的last,x,我原来写的是指针,后来发现了很恐怖的错误,稍后再说
	char x[10]="abababab";//用x数组来存储最新修改过的s1。
	char S2[]="ba";
	char S3[]="ab";
	char *p=S2;//使用指针来遍历数组
	int cnt = 0;
	char *q=S1;
	int c=0;
	while(!c)//在这里终于体会到什么是模块化思想,3个while,3个层面。
	{
		while(*q){//是否将s1中的ba全部替换一遍
              while(cnt<strlen(S2))//这个条件厉害,适用于多中情况的字符串,比下面代码中的条件适用性更强
      {
			if(*p==*q)
				{
					p++;
					q++;
					cnt++;
				}
				else
				{
					if(cnt==1)//这里的cnt=1用来表示当第一个字母相等,第二个不等的情况,实际上这里的1应该换成更为普遍的形式,不过我这里已经默认了,s2的长度为2
					{ 
						p--;//将s2的指针指回初始位置
						cnt=0;
					}
					else if(cnt==0)
				{
					q++;
					cnt=0;
				}
				}
				if(*q== NULL)//这个条件是原先没想到的,,没有这个条件,出不去
				{
					break;
				}
      }
			if(*q)//原来也没有控制是否要打印,通过调试发现在s1的末尾是可能出现越界的,而实际上,只有*q有值,我们才进行替换
			{
				for(int i=0;i<strlen(S2);i++)
				{
					*(q+i-strlen(S2))=S3[i];
				}
			}
			p=S2;//	p=p-strlen(S2);原来写的是注释中的条件,只是觉得这种形式看起来牛一点,故意写成这样的,谁知道翻车了,为此浪费了有1个小时,原因是写成这种形式之后,可能p原来并没有指向NULL,所以可能越界
			cnt=0;
		}
		q=S1;
		puts(S1); 
		printf("\n");
		strcpy(last,x);//这里我原来设last,x为指针,last=x;x=s1;通过这样来让last,x分别指向原来的字符,可是实际上他们都指向一个地址,所以值永远是相同的。所以要用不同的地址来储存,前后的字符串
		strcpy(x,S1);
		if(strcmp(x,last))//检测前后两次字符串是否一致
			c=0;
		else
			c=1; 
	}
	return 0;	
 } 

#include<stdio.h>
#include<string.h>

int main(void)
{			   
	char S1[10]="abababab";
	char last[10]="";
	char x[10]="abababab";
	char S2[]="ba";
	char S3[]="ab";
	char *p=S2;
	int cnt = 0;
	char *q=S1;
	int c=0;
	while(!c)
	{
		while(*q)
		{   
			while(*q)
			{
				if(*p==*q)
				{
					p++;
					q++;
				}
				else
				{
					q++;
				}
				if(*p == NULL)
				{
					break;
				}
			}
             
			if(*q)
			{
				for(int i=0;i<strlen(S2);i++)
				{
					*(q+i-strlen(S2))=S3[i];
				}
			}
			p=S2;//	p=p-strlen(S2);
			cnt=0;
		}
		q=S1;
		puts(S1); 
		printf("\n");
		strcpy(last,x);
		strcpy(x,S1);
		if(strcmp(x,last))
			c=0;
		else
			c=1; 
	}
	return 0;	
 } 

	

哈哈,喜迎升级版,这个版本中,把c换成了0,1,通过是否执行替换来判断是否要继续修改。并且把上个版本中适应性不强的给改了。

#include<stdio.h>
#include<string.h>

int main(void)
{			   
	char S1[]="abababaab";//因为要修改s1,所以要用字符数组,而非字符串常量
	char last[10]="";//这里用的last,x,我原来写的是指针,后来发现了很恐怖的错误,稍后再说
	char x[]="abababaab";//用x数组来存储最新修改过的s1。
	char S2[]="baa";
	char S3[]="aba";
	char *p=S2;//使用指针来遍历数组
	int cnt = 0;
	char *q=S1;
	int c=1;
	while(c)//在这里终于体会到什么是模块化思想,3个while,3个层面。
	{
		c=0;
		while(*q){//是否将s1中的ba全部替换一遍
              while(cnt<strlen(S2))//这个条件厉害,适用于多中情况的字符串,比下面代码中的条件适用性更强
      {
			if(*p==*q)
				{
					p++;
					q++;
					cnt++;
				}
				else
				{
					if(cnt)//这里的cnt=1用来表示当第一个字母相等,第二个不等的情况,实际上这里的1应该换成更为普遍的形式,不过我这里已经默认了,s2的长度为2
					{ 
						p=S2;//将s2的指针指回初始位置
						q=q-cnt+1;//这个贼6
						cnt=0;
					}
					else if(cnt==0)
				{
					q++;
				}
				}
				if(*q== NULL)//这个条件是原先没想到的,,没有这个条件,出不去
				{
					break;
				}
      }
			if(*q)//原来也没有控制是否要打印,通过调试发现在s1的末尾是可能出现越界的,而实际上,只有*q有值,我们才进行替换
			{
				for(int i=0;i<strlen(S2);i++)
				{
					*(q+i-strlen(S2))=S3[i];
					c=1;
				}
			}
			p=S2;//	p=p-strlen(S2);原来写的是注释中的条件,只是觉得这种形式看起来牛一点,故意写成这样的,谁知道翻车了,为此浪费了有1个小时,原因是写成这种形式之后,可能p原来并没有指向NULL,所以可能越界
			cnt=0;
		}
		q=S1;
		puts(S1); 
		printf("\n");
	}
	return 0;	
 }
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值