题目:字符串替换,三个参数字符串A、B、C,用字符串C来替换在字符串A中的B
首先,我们先来分析一下题目中所要实现的程序的功能:我们要获取三个字符串,A是原始的字符串,B是要查找的内容,C是给定的要替换的字符串
那么,首先我们先完成一项功能,查找A中的B,我们先在主函数中给定两个固定的字符串用来测试:
char str1[40] = { "abbabbbaaaabbbb" };
char str2[10] = { "ab" };
也就是我们要在str1中查找有多少str2,这就需要我们进行遍历,我们要实现的逻辑如下:
(1)我们先来比较str1[0]和str2[0];
(2)如果相等,那么我们来比较下一位str1[1]和str2[1];
(3)但如果不相等,那么我们就不需要继续比下去了,我们需要从str[1]再次开始;
(4)我们开始用str1[1]和str[0]进行比较;
后续的步骤相同,因此我们可以利用两个循环嵌套来完成上述的逻辑,为了完成(3)的功能,我们让一个指针变量指向str1的首位,来记录我们下次应该从第几个字符开始重新判定,而我们内层循环的过程中使用标号进行遍历,为了便于测试,我们令返还值为str1中str2中的数量,实现代码如下:
#include <stdio.h>
#include <string.h>
int str_find(char* str1, char* str2);//在字符串1中找2的数量
int main()
{
char str1[40] = { "abbabbbaaaabbbb" };
char str2[10] = { "ab" };
printf("%d", str_find(str1, str2));
return 0;
}
int str_find(char* str1, char* str2)
{
int len1 = strlen(str1);
int len2 = strlen(str2);
int sum = 0,flag = 1;
char* str1_p = str1;
for (int i = 1; i < len1 + 1; i++,flag = 1)
{
for (int j = 0; j < len2; j++)
{
if (*str1_p == str2[j]) str1_p += 1;
else
{
str1_p = &str1[i];
flag = 0;
break;
}
}
if (flag == 1) sum += 1;
}
return sum;
}
我们运行一下,可以看到结果如下:
说明我们所设计的逻辑是没有问题的,接下我们来实现替换字符串的功能及逻辑:
在原程序实现的基础上,我们每当检测到ab时我们令指向输出的空字符串的指针赋值为对应的我们要替换的字符串,而没检测到ab的时侯,则要让指针赋值为指向原字符串的指针的值,过程有些繁琐,代码如下:
int str_findandchange(char* str1, char* str2, char* str3, char* str4)
{
int len1 = strlen(str1);
int len2 = strlen(str2);
int len3 = strlen(str3);
int flag = 1;
char* str1_p = str1;
char* str4_p = str4;
for (int i = 0; i < len1; i++,flag = 1)
{
for (int j = 0; j < len2; j++)
{
if (*str1_p != str2[j])
{
flag = 0;
break;
}
else
{
str1_p += 1;
}
}
if (flag)
{
for (int j = 0; j < len3; j++)
{
*str4_p = str3[j];
str4_p += 1;
}
}
else
{
*str4_p = *str1_p;
str4_p += 1;
str1_p += 1;
}
}
return 0;
}
输出结果如下:
我们再将三个量均变为键盘输入即可,最终代码如下:
#include <stdio.h>
#include <string.h>
int str_findandchange(char* str1, char* str2, char* str3 ,char* str4);//在字符串1中找2的数量
int main()
{
char str1[40] = { "\0" };
char str2[10] = { "\0" };
char str3[10] = { "\0" };
gets(str1);
gets(str2);
gets(str3);
char str_output[100] = {"\0"};
str_findandchange(str1, str2, str3, str_output);
printf("%s", str_output);
return 0;
}
int str_findandchange(char* str1, char* str2, char* str3, char* str4)
{
int len1 = strlen(str1);
int len2 = strlen(str2);
int len3 = strlen(str3);
int flag = 0;
char* str1_idx = str1;
char* str4_idx = str4;
while(*str1_idx != '\0')
{
for (int j = 0; j < len2; j++)
{
if (*str1_idx != str2[j])
{
flag = 0;
break;
}
else
{
flag = 1;
str1_idx++;
if(*str1_idx == '\0') str1_idx--;//防止在末尾处出现了str2中已有的字符
}
}
if (flag)
{
str1_idx--;
for (int j = 0; j < len3; j++)
{
*str4_idx = str3[j];
str4_idx++;
}
}
else
{
*str4_idx = *str1_idx;
str4_idx++;
}
str1_idx++;
}
return 0;
}
2022/7/28更新
如果使用string.h中的函数将更加的简单
# include <stdio.h>
# include <string.h>
int main()
{
char A[100] = "\0";
char B[100] = "\0";
char C[100] = "\0";
char D[100] = "\0";
char* pa = A;
char* pd = D;
gets(A);
gets(B);
gets(C);
int lenA = strlen(A);
int lenB = strlen(B);
int lenC = strlen(C);
while (*pa != '\0')
{
if (strncmp(pa, B, lenB ) == 0)
{
strcpy(pd, C);
pd += lenC;
}
else
{
strncpy(pd, pa, 1);
pd += 1;
}
pa++;
}
printf("%s", D);
return 0;
}