跟谁学公司二面时,直接上来就出了一道题,就是代替用一个字符串代替一个字符串中的某个子串(存在多个),而且只能用到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;
}