C/C++之代替字符串子串

跟谁学公司二面时,直接上来就出了一道题,就是代替用一个字符串代替一个字符串中的某个子串(存在多个),而且只能用到strlen()、strcpy()、strcmp()函数。当时是蒙圈的,写了半个小时也没写出来。。下面记录一下吧:

#include<stdlib.h>
#include<iostream>
#include<algorithm>

int checkStr(char *s1, char *s2) //匹配字符串相不相等 
{
	for (int i = 0; i < strlen(s2); i++)
	{
		if (s1[i] != s2[i]) return 0;
	}
	return 1;
}
void reStr(char *s1, char *s2, char *s3)//替换字符串 
{  
	int s1len = strlen(s1),
		s2len = strlen(s2),    
		s3len = strlen(s3);
	int n1 = s1len - s2len;
	int n2 = s2len - s3len;
	if (n2 > 0)
	{
		//后面的字符串全部向前移n2个位置 
		for (int i = s2len; i < s1len; i++)
		{
			s1[i - n2] = s1[i];
		}
		s1[s1len - n2] = '\0';
	}
	else if (n2 < 0)//后面的字符串全部向后移n2个位置 
	{
		for (int i = s1len; i >= s2len; i--)
		{
		//n2为负数
			s1[i - n2] = s1[i];
		}
		s1[s1len - n2 + 1] = '\0'; 
		 
	}
	//然后在把要替换的字符串插进去 
	for (int i = 0; i < s3len; i++)
	{
		s1[i] = s3[i];
	}
}
int replaceStr(char *s1, char *s2, char *s3)//替换字符串函数返回n表示替换了多少次 
{
	int n = 0;
	for (int i = 0; i < strlen(s1); i++)
	{
		if (s1[i] == s2[0] && checkStr(&s1[i], s2) == 1)
		{
			reStr(&s1[i], s2, s3);
			n++;
		}
	}
	return n;
}
int main()
{
	// test!!! 
	char s1[30] = "qwertyuerp";
	char s2[] = "er";
	char s3[] = "111111";
	printf("%d\n%s\n", replaceStr(s1, s2, s3), s1);

	system("pause");
	return 0;
}

另外如果使用c++的string模板类操作如下:

#include<iostream>
#include<string>
using namespace std;

bool checkStr(string s1, string s2, int n) //匹配字符串相不相等 
{
	for (int i = n; i < s2.size(); i++)
	{
		if (s1[i] != s2[i]) return false;
	}
	return true;
}
int main()
{
	string s = "asfhnafgrytahrg";
	string s1 = "bbbb";
	string s2 = "a";

	for (int i = 0; i < s.size(); i++)
	{
		if (s[i] == s2[0] && checkStr(s, s2 ,i))
		{
			s = s.replace(s.begin()+i, s.begin()+i + s2.size(), s1);
		}
	}

	//s=s.replace(n, n+s2.size(), s1);
	cout << s << endl;

	system("pause");
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值