在s串中,寻找t串,将之替换为g串.并记录有几次替换.

例、输入:s串 regret —— t串 re —— g串 log

在s串中查询t串re,发现两处,即两次替换后,输出替换后的s串为 logglogt

实现思路

先分别定义s、t、g对应的字符数组,给上相应大小,并指向数组,分别输入s、t、g串

调用函数 replace_str ,将s、t、g作实参传入,执行查询替换

先定义一个count,作用是记录替换次数,也可作查询到几处t串

再定义的str数组及指针,储存替换后 新的字符串。

而定义的p,记录str存储进度

接下来开始循环遍历,循环次数为s串的长度,因为要将s串中的每个字符遍历一次

新定义的k,为t串的比较进度,当循环到s串的下一个字符,t串比较进度需重新刷新为0,所以在循环内部定义,且内循环每次结束k++,表示比较t串的下一个字符。

而内循环的j,会根据当前外循环的i改变而随之改变,代表s串的比较进度

内循环每次判断s串与t串中字符相等,记录相等的次数m,如次数达到t串的长度,即表示在s串中查询到一处与t串相等的地方。

例:s 串 asacadd t串ac

只有当连续两次都相等时,即aa,cc时,才会被记录。避免as与ac判断时,有一次相等,a==a,不满足条件。

所以进行循环后进行判断m次数,是否与t串长度相等,是,则进行循环赋值,将替换的g串赋值到str中,并且记录存储进度。而且进行了一次替换,所以count计数加一。

且下次循环将跳过t串长度-1的i,所以将i加上(strlen(t)-1),为什么?

解释:如下次循环还按着顺序执行i++,那么在s串中寻找的t串,只会被替换一个。不符合程序设定,只能成功替换当t串长度为一的。所以每当t串被查询到一次,i循环将跳过 (strlen(t)-1) 。

例:regret 当第一次循环到re,将之替换为log后,第二次循环就应该从i指向regret中的g开始,而不是i++指向的e,因为e已经被替换掉了,不可再进行赋值到str中。

如判断为,否,则将s串中原本不动的赋值到str中,且用p记录存储进度。

整个循环结束,表示已经全部查询替换存储完成,在str最后赋值上’\0’,表示str串的结束。存储完成。

输出打印count与str串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
#include <string.h>
int main()
{
int replace_str(char *s, char *t, char *g); //替换函数
char *s, *t, *g;
char s1[20], t1[5], g1[10];
s = s1;
t = t1;
g = g1;
gets(s);
gets(t);
gets(g);
replace_str(s, t, g);
return 0;
}
int replace_str(char *s, char *t, char *g)
{
int count = 0; //计数
char str1[100];
char *str;
str = str1;
int p = 0; //记录str存储进度
for (int i = 0; i < strlen(s); i++) {
int k = 0; //循环t的比较进度
int m = 0; //记录单字符相等次数
for (int j = i; j < strlen(t) + i; j++, k++) {
if (*(s + j) == *(t + k)) {
m++;
}
}
if (m == strlen(t)) //标志在s串中找到一处与t串相同
{
for (int n = 0; n < strlen(g); n++) {
*(str + p) = *(g + n);
p++;
}
count++;
i += (strlen(t) - 1); //跳过下...次循环
} else {
*(str + p) = *(s + i);
p++;
}
}
*(str + p) = '\0';
printf("%s\n", str);
printf("count=%d\n", count);
return 0;
}