删除A字符串中B字符串有的字符

/****************************************************************
* name;DelStrAofStrB
* function:删除字符A里面含有的B字符
* parameter;
* @char *strA
* @char *strB
* ReValue;strA
* author;小北blog
* attention;none
* date;2024.05.07
* Copyright(c) 2024 huahuadebaby99@163.com All rights Reserved
*****************************************************************/
/****************************************************************
* name;DelStrAofStrB
* function:删除字符A里面含有的B字符
* parameter;
* @char *strA
* @char *strB
* ReValue;strA
* author;小北blog
* attention;none
* date;2024.05.07
* Copyright(c) 2024 huahuadebaby99@163.com All rights Reserved
*****************************************************************/
#include <stdio.h>
char *DelStrAofStrB(char *strA, char *strB)
{
// 判断字符串B是否到尾部
while (*strB != '\0')
{
// 判断字符串B的当前字符是否属于字母(不论大小写)
if ((*strB < 'A' || *strB > 'Z') && (*strB < 'a' || *strB > 'z'))
{
// 如果字符串B的字符不是字母,则向后偏移
strB++;
continue;
}
// 保存A字符串的地址
char *MemberstrA = strA;
// 让字符串B中的字符都和字符串A每个字符比较
while (*strA != '\0')
{
// 比较字符的ASCII码,不分大小写
if (*strB == *strA || *strB == (*strA + 32) || *strB == (*strA - 32))
{
// 找到匹配的字符,删除字符串A中的这个字符
char *temp = strA;
while (*temp != '\0')
{
*temp = *(temp + 1);
temp++;
}
}
else
strA++; // 不相等的情况那么比较下一个
}
strB++; // 处理下一个字符B
// 重置A的地址
strA = MemberstrA;
}
return strA;
}
int main(void)
{
char A[30] = "delllLLopqrst";
char B[10] = "dels";
DelStrAofStrB(A, B);
printf("%s\n", A);
return 0;
}
}
验证结果

代码实现思想:
1.考虑这个函数传进来是两个数组指针,返回的是A字符串删除后了的指针,其实字符串A的地址没有改变
2.考虑到框架问题,应该先考虑到用循环遍历B字符串的每一个字符,直到最后,并且只接收字母。
3.考虑到返回的A字符串的地址不能发生改变,所以后面需要A字符串的地址的时候备份就好了。
4.前面遍历B字符串做好了那么就再做遍历A字符串的比较工作,这里第二个循环是该代码的中心思想:
判断是否相等不论大小字母,也要备份在这个循环当中A所在的地址,当匹配时删除字符,当前地址后的所有字符整体往前移动一个字符单位,但是由于会发生相同字母或者相同字母不同大小区别的连续的情况,所以这时候不对A字符指针做向后偏移的动作,而只对备份的指针做偏移,所以当再循环的时候A字符串的地址还是不发生改变,或者说该动作没有++自增。这样删除的时候A当前位置下被A后一个字符覆盖时,该字符也是符合删除条件但没有被删除。

浙公网安备 33010602011771号